usr/src/uts/common/io/fibre-channel/fca/qlge/qlge.c
author Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
Mon, 05 Apr 2010 05:20:48 -0600
changeset 12073 05ba1c0d6140
parent 11878 ac93462db6d7
child 12319 450834a921de
permissions -rw-r--r--
6923815 Implement FMA functionality in qlge driver 6936309 qlge 1.03 performance is only at about 2G in Sparc M series systems
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     1
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     3
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     7
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    11
 * and limitations under the License.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    12
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    18
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    20
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    21
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    22
/*
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    23
 * Copyright 2010 QLogic Corporation. All rights reserved.
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    24
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    25
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    26
#include <qlge.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    27
#include <sys/atomic.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    28
#include <sys/strsubr.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    29
#include <sys/pattr.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    30
#include <netinet/in.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    31
#include <netinet/ip.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    32
#include <netinet/ip6.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    33
#include <netinet/tcp.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    34
#include <netinet/udp.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    35
#include <inet/ip.h>
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    36
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    37
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    38
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    39
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    40
 * Local variables
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    41
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    42
static struct ether_addr ql_ether_broadcast_addr =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    43
	{0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    44
static char version[] = "GLDv3 QLogic 81XX " VERSIONSTR;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    45
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    46
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    47
 * Local function prototypes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    48
 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    49
static void ql_free_resources(qlge_t *);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    50
static void ql_fini_kstats(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    51
static uint32_t ql_get_link_state(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    52
static void ql_read_conf(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    53
static int ql_alloc_phys(dev_info_t *, ddi_dma_handle_t *,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    54
    ddi_device_acc_attr_t *, uint_t, ddi_acc_handle_t *,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    55
    size_t, size_t, caddr_t *, ddi_dma_cookie_t *);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    56
static int ql_alloc_phys_rbuf(dev_info_t *, ddi_dma_handle_t *,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    57
    ddi_device_acc_attr_t *, uint_t, ddi_acc_handle_t *,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    58
    size_t, size_t, caddr_t *, ddi_dma_cookie_t *);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    59
static void ql_free_phys(ddi_dma_handle_t *, ddi_acc_handle_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    60
static int ql_set_routing_reg(qlge_t *, uint32_t, uint32_t, int);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    61
static int ql_route_initialize(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    62
static int ql_attach(dev_info_t *, ddi_attach_cmd_t);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    63
static int ql_detach(dev_info_t *, ddi_detach_cmd_t);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    64
static int ql_bringdown_adapter(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    65
static int ql_bringup_adapter(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    66
static int ql_asic_reset(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    67
static void ql_wake_mpi_reset_soft_intr(qlge_t *);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    68
static void ql_stop_timer(qlge_t *qlge);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    69
static void ql_fm_fini(qlge_t *qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    70
int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    71
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    72
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    73
 * TX dma maping handlers allow multiple sscatter-gather lists
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    74
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    75
ddi_dma_attr_t  tx_mapping_dma_attr = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    76
	DMA_ATTR_V0,			/* dma_attr_version */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    77
	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    78
	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    79
	QL_DMA_XFER_COUNTER,		/* DMA counter register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    80
	QL_DMA_ADDRESS_ALIGNMENT,	/* DMA address alignment, default - 8 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    81
	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    82
	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    83
	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    84
	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    85
	QL_MAX_TX_DMA_HANDLES,		/* s/g list length */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    86
	QL_DMA_GRANULARITY,		/* granularity of device */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
    87
	DDI_DMA_RELAXED_ORDERING	/* DMA transfer flags */
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    88
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    89
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    90
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    91
 * Receive buffers and Request/Response queues do not allow scatter-gather lists
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    92
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    93
ddi_dma_attr_t  dma_attr = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    94
	DMA_ATTR_V0,			/* dma_attr_version */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    95
	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    96
	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    97
	QL_DMA_XFER_COUNTER,		/* DMA counter register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    98
	QL_DMA_ADDRESS_ALIGNMENT,	/* DMA address alignment, default - 8 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
    99
	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   100
	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   101
	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   102
	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   103
	1,				/* s/g list length, i.e no sg list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   104
	QL_DMA_GRANULARITY,		/* granularity of device */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   105
	QL_DMA_XFER_FLAGS		/* DMA transfer flags */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   106
};
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   107
/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   108
 * Receive buffers do not allow scatter-gather lists
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   109
 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   110
ddi_dma_attr_t  dma_attr_rbuf = {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   111
	DMA_ATTR_V0,			/* dma_attr_version */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   112
	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   113
	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   114
	QL_DMA_XFER_COUNTER,		/* DMA counter register */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   115
	0x1,				/* DMA address alignment, default - 8 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   116
	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   117
	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   118
	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   119
	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   120
	1,				/* s/g list length, i.e no sg list */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   121
	QL_DMA_GRANULARITY,		/* granularity of device */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   122
	DDI_DMA_RELAXED_ORDERING	/* DMA transfer flags */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   123
};
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   124
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   125
 * DMA access attribute structure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   126
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   127
/* device register access from host */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   128
ddi_device_acc_attr_t ql_dev_acc_attr = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   129
	DDI_DEVICE_ATTR_V0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   130
	DDI_STRUCTURE_LE_ACC,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   131
	DDI_STRICTORDER_ACC
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   132
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   133
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   134
/* host ring descriptors */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   135
ddi_device_acc_attr_t ql_desc_acc_attr = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   136
	DDI_DEVICE_ATTR_V0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   137
	DDI_NEVERSWAP_ACC,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   138
	DDI_STRICTORDER_ACC
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   139
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   140
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   141
/* host ring buffer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   142
ddi_device_acc_attr_t ql_buf_acc_attr = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   143
	DDI_DEVICE_ATTR_V0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   144
	DDI_NEVERSWAP_ACC,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   145
	DDI_STRICTORDER_ACC
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   146
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   147
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   148
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   149
 * Hash key table for Receive Side Scaling (RSS) support
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   150
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   151
const uint8_t key_data[] = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   152
	0x23, 0x64, 0xa1, 0xaa, 0x37, 0xc0, 0xed, 0x05, 0x2b, 0x36,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   153
	0x50, 0x5c, 0x45, 0x1e, 0x7e, 0xc8, 0x5d, 0x2a, 0x54, 0x2f,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   154
	0xe4, 0x3d, 0x0f, 0xbb, 0x91, 0xd9, 0x25, 0x60, 0xd4, 0xf8,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   155
	0x12, 0xa0, 0x59, 0x4b, 0x9e, 0x8a, 0x51, 0xda, 0xcd, 0x49};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   156
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   157
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   158
 * Shadow Registers:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   159
 * Outbound queues have a consumer index that is maintained by the chip.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   160
 * Inbound queues have a producer index that is maintained by the chip.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   161
 * For lower overhead, these registers are "shadowed" to host memory
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   162
 * which allows the device driver to track the queue progress without
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   163
 * PCI reads. When an entry is placed on an inbound queue, the chip will
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   164
 * update the relevant index register and then copy the value to the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   165
 * shadow register in host memory.
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   166
 * Currently, ql_read_sh_reg only read Inbound queues'producer index.
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   167
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   168
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   169
static inline unsigned int
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   170
ql_read_sh_reg(qlge_t *qlge, struct rx_ring *rx_ring)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   171
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   172
	uint32_t rtn;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   173
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   174
	/* re-synchronize shadow prod index dma buffer before reading */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   175
	(void) ddi_dma_sync(qlge->host_copy_shadow_dma_attr.dma_handle,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   176
	    rx_ring->prod_idx_sh_reg_offset,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   177
	    sizeof (uint32_t), DDI_DMA_SYNC_FORKERNEL);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   178
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   179
	rtn = ddi_get32(qlge->host_copy_shadow_dma_attr.acc_handle,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   180
	    (uint32_t *)rx_ring->prod_idx_sh_reg);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   181
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   182
	return (rtn);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   183
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   184
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   185
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   186
 * Read 32 bit atomically
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   187
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   188
uint32_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   189
ql_atomic_read_32(volatile uint32_t *target)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   190
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   191
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   192
	 * atomic_add_32_nv returns the new value after the add,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   193
	 * we are adding 0 so we should get the original value
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   194
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   195
	return (atomic_add_32_nv(target, 0));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   196
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   197
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   198
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   199
 * Set 32 bit atomically
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   200
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   201
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   202
ql_atomic_set_32(volatile uint32_t *target, uint32_t newval)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   203
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   204
	(void) atomic_swap_32(target, newval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   205
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   206
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   207
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   208
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   209
 * Setup device PCI configuration registers.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   210
 * Kernel context.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   211
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   212
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   213
ql_pci_config(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   214
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   215
	uint16_t w;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   216
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   217
	qlge->vendor_id = (uint16_t)pci_config_get16(qlge->pci_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   218
	    PCI_CONF_VENID);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   219
	qlge->device_id = (uint16_t)pci_config_get16(qlge->pci_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   220
	    PCI_CONF_DEVID);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   221
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   222
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   223
	 * we want to respect framework's setting of PCI
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   224
	 * configuration space command register and also
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   225
	 * want to make sure that all bits of interest to us
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   226
	 * are properly set in PCI Command register(0x04).
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   227
	 * PCI_COMM_IO		0x1	 I/O access enable
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   228
	 * PCI_COMM_MAE		0x2	 Memory access enable
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   229
	 * PCI_COMM_ME		0x4	 bus master enable
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   230
	 * PCI_COMM_MEMWR_INVAL	0x10	 memory write and invalidate enable.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   231
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   232
	w = (uint16_t)pci_config_get16(qlge->pci_handle, PCI_CONF_COMM);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   233
	w = (uint16_t)(w & (~PCI_COMM_IO));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   234
	w = (uint16_t)(w | PCI_COMM_MAE | PCI_COMM_ME |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   235
	    /* PCI_COMM_MEMWR_INVAL | */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   236
	    PCI_COMM_PARITY_DETECT | PCI_COMM_SERR_ENABLE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   237
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   238
	pci_config_put16(qlge->pci_handle, PCI_CONF_COMM, w);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   239
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   240
	w = pci_config_get16(qlge->pci_handle, 0x54);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   241
	cmn_err(CE_NOTE, "!dev_ctl old 0x%x\n", w);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   242
	w = (uint16_t)(w & (~0x7000));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   243
	w = (uint16_t)(w | 0x5000);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   244
	pci_config_put16(qlge->pci_handle, 0x54, w);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   245
	cmn_err(CE_NOTE, "!dev_ctl new 0x%x\n", w);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   246
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   247
	ql_dump_pci_config(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   248
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   249
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   250
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   251
 * This routine parforms the neccessary steps to set GLD mac information
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   252
 * such as Function number, xgmac mask and shift bits
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   253
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   254
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   255
ql_set_mac_info(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   256
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   257
	uint32_t value;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   258
	int rval = DDI_FAILURE;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   259
	uint32_t fn0_net, fn1_net;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   260
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   261
	/* set default value */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   262
	qlge->fn0_net = FN0_NET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   263
	qlge->fn1_net = FN1_NET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   264
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   265
	if (ql_read_processor_data(qlge, MPI_REG, &value) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   266
		cmn_err(CE_WARN, "%s(%d) read MPI register failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   267
		    __func__, qlge->instance);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   268
		goto exit;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   269
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   270
		fn0_net = (value >> 1) & 0x07;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   271
		fn1_net = (value >> 5) & 0x07;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   272
		if ((fn0_net > 4) || (fn1_net > 4) || (fn0_net == fn1_net)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   273
			cmn_err(CE_WARN, "%s(%d) bad mpi register value %x, \n"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   274
			    "nic0 function number %d,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   275
			    "nic1 function number %d "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   276
			    "use default\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   277
			    __func__, qlge->instance, value, fn0_net, fn1_net);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   278
			goto exit;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   279
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   280
			qlge->fn0_net = fn0_net;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   281
			qlge->fn1_net = fn1_net;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   282
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   283
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   284
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   285
	/* Get the function number that the driver is associated with */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   286
	value = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   287
	qlge->func_number = (uint8_t)((value >> 6) & 0x03);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   288
	QL_PRINT(DBG_INIT, ("status register is:%x, func_number: %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   289
	    value, qlge->func_number));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   290
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   291
	/* The driver is loaded on a non-NIC function? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   292
	if ((qlge->func_number != qlge->fn0_net) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   293
	    (qlge->func_number != qlge->fn1_net)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   294
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   295
		    "Invalid function number = 0x%x\n", qlge->func_number);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   296
		goto exit;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   297
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   298
	/* network port 0? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   299
	if (qlge->func_number == qlge->fn0_net) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   300
		qlge->xgmac_sem_mask = QL_PORT0_XGMAC_SEM_MASK;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   301
		qlge->xgmac_sem_bits = QL_PORT0_XGMAC_SEM_BITS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   302
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   303
		qlge->xgmac_sem_mask = QL_PORT1_XGMAC_SEM_MASK;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   304
		qlge->xgmac_sem_bits = QL_PORT1_XGMAC_SEM_BITS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   305
	}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   306
	rval = DDI_SUCCESS;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   307
exit:
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   308
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   309
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   310
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   311
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   312
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   313
 * write to doorbell register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   314
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   315
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   316
ql_write_doorbell_reg(qlge_t *qlge, uint32_t *addr, uint32_t data)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   317
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   318
	ddi_put32(qlge->dev_doorbell_reg_handle, addr, data);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   319
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   320
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   321
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   322
 * read from doorbell register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   323
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   324
uint32_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   325
ql_read_doorbell_reg(qlge_t *qlge, uint32_t *addr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   326
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   327
	uint32_t ret;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   328
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   329
	ret = ddi_get32(qlge->dev_doorbell_reg_handle, addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   330
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   331
	return	(ret);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   332
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   333
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   334
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   335
 * This function waits for a specific bit to come ready
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   336
 * in a given register.  It is used mostly by the initialize
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   337
 * process, but is also used in kernel thread API such as
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   338
 * netdev->set_multi, netdev->set_mac_address, netdev->vlan_rx_add_vid.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   339
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   340
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   341
ql_wait_reg_rdy(qlge_t *qlge, uint32_t reg, uint32_t bit, uint32_t err_bit)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   342
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   343
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   344
	int count = UDELAY_COUNT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   345
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   346
	while (count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   347
		temp = ql_read_reg(qlge, reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   348
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   349
		/* check for errors */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   350
		if ((temp & err_bit) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   351
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   352
		} else if ((temp & bit) != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   353
			return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   354
		qlge_delay(UDELAY_DELAY);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   355
		count--;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   356
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   357
	cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   358
	    "Waiting for reg %x to come ready failed.", reg);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   359
	if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   360
		ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   361
		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   362
	}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   363
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   364
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   365
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   366
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   367
 * The CFG register is used to download TX and RX control blocks
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   368
 * to the chip. This function waits for an operation to complete.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   369
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   370
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   371
ql_wait_cfg(qlge_t *qlge, uint32_t bit)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   372
{
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   373
	return (ql_wait_reg_bit(qlge, REG_CONFIGURATION, bit, BIT_RESET, 0));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   374
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   375
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   376
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   377
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   378
 * Used to issue init control blocks to hw. Maps control block,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   379
 * sets address, triggers download, waits for completion.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   380
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   381
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   382
ql_write_cfg(qlge_t *qlge, uint32_t bit, uint64_t phy_addr, uint16_t q_id)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   383
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   384
	int status = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   385
	uint32_t mask;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   386
	uint32_t value;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   387
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   388
	status = ql_sem_spinlock(qlge, SEM_ICB_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   389
	if (status != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   390
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   391
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   392
	status = ql_wait_cfg(qlge, bit);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   393
	if (status != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   394
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   395
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   396
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   397
	ql_write_reg(qlge, REG_ICB_ACCESS_ADDRESS_LOWER, LS_64BITS(phy_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   398
	ql_write_reg(qlge, REG_ICB_ACCESS_ADDRESS_UPPER, MS_64BITS(phy_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   399
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   400
	mask = CFG_Q_MASK | (bit << 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   401
	value = bit | (q_id << CFG_Q_SHIFT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   402
	ql_write_reg(qlge, REG_CONFIGURATION, (mask | value));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   403
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   404
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   405
	 * Wait for the bit to clear after signaling hw.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   406
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   407
	status = ql_wait_cfg(qlge, bit);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   408
	ql_sem_unlock(qlge, SEM_ICB_MASK); /* does flush too */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   409
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   410
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   411
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   412
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   413
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   414
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   415
 * Initialize adapter instance
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   416
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   417
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   418
ql_init_instance(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   419
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   420
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   421
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   422
	/* Default value */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   423
	qlge->mac_flags = QL_MAC_INIT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   424
	qlge->mtu = ETHERMTU;		/* set normal size as default */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   425
	qlge->page_size = VM_PAGE_SIZE;	/* default page size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   426
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   427
	for (i = 0; i < MAX_RX_RINGS; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   428
		qlge->rx_polls[i] = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   429
		qlge->rx_interrupts[i] = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   430
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   431
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   432
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   433
	 * Set up the operating parameters.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   434
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   435
	qlge->multicast_list_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   436
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   437
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   438
	 * Set up the max number of unicast list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   439
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   440
	qlge->unicst_total = MAX_UNICAST_LIST_SIZE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   441
	qlge->unicst_avail = MAX_UNICAST_LIST_SIZE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   442
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   443
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   444
	 * read user defined properties in .conf file
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   445
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   446
	ql_read_conf(qlge); /* mtu, pause, LSO etc */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   447
	qlge->rx_ring_count = qlge->tx_ring_count + qlge->rss_ring_count;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   448
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   449
	QL_PRINT(DBG_INIT, ("mtu is %d \n", qlge->mtu));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   450
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   451
	/* choose Memory Space mapping and get Vendor Id, Device ID etc */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   452
	ql_pci_config(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   453
	qlge->ip_hdr_offset = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   454
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   455
	if (qlge->device_id == 0x8000) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   456
		/* Schultz card */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   457
		qlge->cfg_flags |= CFG_CHIP_8100;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   458
		/* enable just ipv4 chksum offload for Schultz */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   459
		qlge->cfg_flags |= CFG_CKSUM_FULL_IPv4;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   460
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   461
		 * Schultz firmware does not do pseduo IP header checksum
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   462
		 * calculation, needed to be done by driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   463
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   464
		qlge->cfg_flags |= CFG_HW_UNABLE_PSEUDO_HDR_CKSUM;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   465
		if (qlge->lso_enable)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   466
			qlge->cfg_flags |= CFG_LSO;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   467
		qlge->cfg_flags |= CFG_SUPPORT_SCATTER_GATHER;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   468
		/* Schultz must split packet header */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   469
		qlge->cfg_flags |= CFG_ENABLE_SPLIT_HEADER;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   470
		qlge->max_read_mbx = 5;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   471
		qlge->ip_hdr_offset = 2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   472
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   473
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   474
	/* Set Function Number and some of the iocb mac information */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   475
	if (ql_set_mac_info(qlge) != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   476
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   477
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   478
	/* Read network settings from NVRAM */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   479
	/* After nvram is read successfully, update dev_addr */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   480
	if (ql_get_flash_params(qlge) == DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   481
		QL_PRINT(DBG_INIT, ("mac%d address is \n", qlge->func_number));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   482
		for (i = 0; i < ETHERADDRL; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   483
			qlge->dev_addr.ether_addr_octet[i] =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   484
			    qlge->nic_config.factory_MAC[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   485
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   486
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   487
		cmn_err(CE_WARN, "%s(%d): Failed to read flash memory",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   488
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   489
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   490
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   491
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   492
	bcopy(qlge->dev_addr.ether_addr_octet,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   493
	    qlge->unicst_addr[0].addr.ether_addr_octet,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   494
	    ETHERADDRL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   495
	QL_DUMP(DBG_INIT, "\t flash mac address dump:\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   496
	    &qlge->dev_addr.ether_addr_octet[0], 8, ETHERADDRL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   497
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   498
	qlge->port_link_state = LS_DOWN;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   499
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   500
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   501
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   502
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   503
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   504
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   505
 * This hardware semaphore provides the mechanism for exclusive access to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   506
 * resources shared between the NIC driver, MPI firmware,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   507
 * FCOE firmware and the FC driver.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   508
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   509
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   510
ql_sem_trylock(qlge_t *qlge, uint32_t sem_mask)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   511
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   512
	uint32_t sem_bits = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   513
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   514
	switch (sem_mask) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   515
	case SEM_XGMAC0_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   516
		sem_bits = SEM_SET << SEM_XGMAC0_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   517
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   518
	case SEM_XGMAC1_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   519
		sem_bits = SEM_SET << SEM_XGMAC1_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   520
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   521
	case SEM_ICB_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   522
		sem_bits = SEM_SET << SEM_ICB_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   523
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   524
	case SEM_MAC_ADDR_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   525
		sem_bits = SEM_SET << SEM_MAC_ADDR_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   526
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   527
	case SEM_FLASH_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   528
		sem_bits = SEM_SET << SEM_FLASH_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   529
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   530
	case SEM_PROBE_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   531
		sem_bits = SEM_SET << SEM_PROBE_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   532
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   533
	case SEM_RT_IDX_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   534
		sem_bits = SEM_SET << SEM_RT_IDX_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   535
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   536
	case SEM_PROC_REG_MASK:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   537
		sem_bits = SEM_SET << SEM_PROC_REG_SHIFT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   538
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   539
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   540
		cmn_err(CE_WARN, "Bad Semaphore mask!.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   541
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   542
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   543
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   544
	ql_write_reg(qlge, REG_SEMAPHORE, sem_bits | sem_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   545
	return (!(ql_read_reg(qlge, REG_SEMAPHORE) & sem_bits));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   546
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   547
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   548
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   549
 * Lock a specific bit of Semaphore register to gain
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   550
 * access to a particular shared register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   551
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   552
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   553
ql_sem_spinlock(qlge_t *qlge, uint32_t sem_mask)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   554
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   555
	unsigned int wait_count = 30;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   556
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   557
	while (wait_count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   558
		if (!ql_sem_trylock(qlge, sem_mask))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   559
			return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   560
		qlge_delay(100);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   561
		wait_count--;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   562
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   563
	cmn_err(CE_WARN, "%s(%d) sem_mask 0x%x lock timeout ",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   564
	    __func__, qlge->instance, sem_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   565
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   566
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   567
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   568
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   569
 * Unock a specific bit of Semaphore register to release
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   570
 * access to a particular shared register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   571
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   572
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   573
ql_sem_unlock(qlge_t *qlge, uint32_t sem_mask)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   574
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   575
	ql_write_reg(qlge, REG_SEMAPHORE, sem_mask);
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
   576
	(void) ql_read_reg(qlge, REG_SEMAPHORE);	/* flush */
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   577
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   578
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   579
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   580
 * Get property value from configuration file.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   581
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   582
 * string = property string pointer.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   583
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   584
 * Returns:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   585
 * 0xFFFFFFFF = no property else property value.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   586
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   587
static uint32_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   588
ql_get_prop(qlge_t *qlge, char *string)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   589
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   590
	char buf[256];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   591
	uint32_t data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   592
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   593
	/* Get adapter instance parameter. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   594
	(void) sprintf(buf, "hba%d-%s", qlge->instance, string);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   595
	data = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY, qlge->dip, 0, buf,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   596
	    (int)0xffffffff);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   597
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   598
	/* Adapter instance parameter found? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   599
	if (data == 0xffffffff) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   600
		/* No, get default parameter. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   601
		data = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY, qlge->dip, 0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   602
		    string, (int)0xffffffff);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   603
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   604
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   605
	return (data);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   606
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   607
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   608
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   609
 * Read user setting from configuration file.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   610
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   611
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   612
ql_read_conf(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   613
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   614
	uint32_t data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   615
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   616
	/* clear configuration flags */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   617
	qlge->cfg_flags = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   618
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   619
	/* Set up the default ring sizes. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   620
	qlge->tx_ring_size = NUM_TX_RING_ENTRIES;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   621
	data = ql_get_prop(qlge, "tx_ring_size");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   622
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   623
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   624
		if (qlge->tx_ring_size != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   625
			qlge->tx_ring_size = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   626
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   627
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   628
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   629
	qlge->rx_ring_size = NUM_RX_RING_ENTRIES;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   630
	data = ql_get_prop(qlge, "rx_ring_size");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   631
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   632
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   633
		if (qlge->rx_ring_size != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   634
			qlge->rx_ring_size = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   635
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   636
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   637
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   638
	qlge->tx_ring_count = 8;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   639
	data = ql_get_prop(qlge, "tx_ring_count");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   640
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   641
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   642
		if (qlge->tx_ring_count != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   643
			qlge->tx_ring_count = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   644
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   645
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   646
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   647
	qlge->rss_ring_count = 8;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   648
	data = ql_get_prop(qlge, "rss_ring_count");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   649
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   650
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   651
		if (qlge->rss_ring_count != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   652
			qlge->rss_ring_count = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   653
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   654
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   655
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   656
	/* Get default rx_copy enable/disable. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   657
	if ((data = ql_get_prop(qlge, "force-rx-copy")) == 0xffffffff ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   658
	    data == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   659
		qlge->cfg_flags &= ~CFG_RX_COPY_MODE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   660
		qlge->rx_copy = B_FALSE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   661
		QL_PRINT(DBG_INIT, ("rx copy mode disabled\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   662
	} else if (data == 1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   663
		qlge->cfg_flags |= CFG_RX_COPY_MODE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   664
		qlge->rx_copy = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   665
		QL_PRINT(DBG_INIT, ("rx copy mode enabled\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   666
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   667
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   668
	/* Get mtu packet size. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   669
	data = ql_get_prop(qlge, "mtu");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   670
	if ((data == ETHERMTU) || (data == JUMBO_MTU)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   671
		if (qlge->mtu != data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   672
			qlge->mtu = data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   673
			cmn_err(CE_NOTE, "new mtu is %d\n", qlge->mtu);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   674
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   675
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   676
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   677
	if (qlge->mtu == JUMBO_MTU) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   678
		qlge->rx_coalesce_usecs = DFLT_RX_COALESCE_WAIT_JUMBO;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   679
		qlge->tx_coalesce_usecs = DFLT_TX_COALESCE_WAIT_JUMBO;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   680
		qlge->rx_max_coalesced_frames = DFLT_RX_INTER_FRAME_WAIT_JUMBO;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   681
		qlge->tx_max_coalesced_frames = DFLT_TX_INTER_FRAME_WAIT_JUMBO;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   682
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   683
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   684
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   685
	/* Get pause mode, default is Per Priority mode. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   686
	qlge->pause = PAUSE_MODE_PER_PRIORITY;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   687
	data = ql_get_prop(qlge, "pause");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   688
	if (data <= PAUSE_MODE_PER_PRIORITY) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   689
		if (qlge->pause != data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   690
			qlge->pause = data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   691
			cmn_err(CE_NOTE, "new pause mode %d\n", qlge->pause);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   692
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   693
	}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   694
	/* Receive interrupt delay */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   695
	qlge->rx_coalesce_usecs = DFLT_RX_COALESCE_WAIT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   696
	data = ql_get_prop(qlge, "rx_intr_delay");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   697
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   698
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   699
		if (qlge->rx_coalesce_usecs != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   700
			qlge->rx_coalesce_usecs = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   701
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   702
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   703
	/* Rx inter-packet delay. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   704
	qlge->rx_max_coalesced_frames = DFLT_RX_INTER_FRAME_WAIT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   705
	data = ql_get_prop(qlge, "rx_ipkt_delay");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   706
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   707
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   708
		if (qlge->rx_max_coalesced_frames != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   709
			qlge->rx_max_coalesced_frames = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   710
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   711
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   712
	/* Transmit interrupt delay */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   713
	qlge->tx_coalesce_usecs = DFLT_TX_COALESCE_WAIT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   714
	data = ql_get_prop(qlge, "tx_intr_delay");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   715
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   716
	if ((data != 0xffffffff) && data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   717
		if (qlge->tx_coalesce_usecs != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   718
			qlge->tx_coalesce_usecs = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   719
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   720
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   721
	/* Tx inter-packet delay. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   722
	qlge->tx_max_coalesced_frames = DFLT_TX_INTER_FRAME_WAIT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   723
	data = ql_get_prop(qlge, "tx_ipkt_delay");
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   724
	/* if data is valid */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   725
	if ((data != 0xffffffff) && data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   726
		if (qlge->tx_max_coalesced_frames != data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   727
			qlge->tx_max_coalesced_frames = (uint16_t)data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   728
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   729
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   730
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   731
	/* Get split header payload_copy_thresh. */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   732
	qlge->payload_copy_thresh = DFLT_PAYLOAD_COPY_THRESH;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   733
	data = ql_get_prop(qlge, "payload_copy_thresh");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   734
	/* if data is valid */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   735
	if ((data != 0xffffffff) && (data != 0)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   736
		if (qlge->payload_copy_thresh != data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   737
			qlge->payload_copy_thresh = data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   738
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   739
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   740
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   741
	/* large send offload (LSO) capability. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   742
	qlge->lso_enable = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   743
	data = ql_get_prop(qlge, "lso_enable");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   744
	/* if data is valid */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   745
	if ((data == 0) || (data == 1)) {
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   746
		if (qlge->lso_enable != data) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   747
			qlge->lso_enable = (uint16_t)data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   748
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   749
	}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   750
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   751
	/* dcbx capability. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   752
	qlge->dcbx_enable = 1;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   753
	data = ql_get_prop(qlge, "dcbx_enable");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   754
	/* if data is valid */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   755
	if ((data == 0) || (data == 1)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   756
		if (qlge->dcbx_enable != data) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   757
			qlge->dcbx_enable = (uint16_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   758
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   759
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   760
	/* fault management enable */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   761
	qlge->fm_enable = B_TRUE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   762
	data = ql_get_prop(qlge, "fm-enable");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   763
	if ((data == 0x1) || (data == 0)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   764
		qlge->fm_enable = (boolean_t)data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   765
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
   766
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   767
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   768
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   769
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   770
 * Enable global interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   771
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   772
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   773
ql_enable_global_interrupt(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   774
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   775
	ql_write_reg(qlge, REG_INTERRUPT_ENABLE,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   776
	    (INTR_EN_EI << 16) | INTR_EN_EI);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   777
	qlge->flags |= INTERRUPTS_ENABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   778
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   779
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   780
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   781
 * Disable global interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   782
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   783
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   784
ql_disable_global_interrupt(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   785
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   786
	ql_write_reg(qlge, REG_INTERRUPT_ENABLE, (INTR_EN_EI << 16));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   787
	qlge->flags &= ~INTERRUPTS_ENABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   788
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   789
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   790
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   791
 * Enable one ring interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   792
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   793
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   794
ql_enable_completion_interrupt(qlge_t *qlge, uint32_t intr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   795
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   796
	struct intr_ctx *ctx = qlge->intr_ctx + intr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   797
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   798
	QL_PRINT(DBG_INTR, ("%s(%d): To enable intr %d, irq_cnt %d \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   799
	    __func__, qlge->instance, intr, ctx->irq_cnt));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   800
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   801
	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && intr) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   802
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   803
		 * Always enable if we're MSIX multi interrupts and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   804
		 * it's not the default (zeroeth) interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   805
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   806
		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_en_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   807
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   808
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   809
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   810
	if (!atomic_dec_32_nv(&ctx->irq_cnt)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   811
		mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   812
		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_en_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   813
		mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   814
		QL_PRINT(DBG_INTR,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   815
		    ("%s(%d): write %x to intr enable register \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   816
		    __func__, qlge->instance, ctx->intr_en_mask));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   817
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   818
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   819
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   820
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   821
 * ql_forced_disable_completion_interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   822
 * Used by call from OS, may be called without
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   823
 * a pending interrupt so force the disable
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   824
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   825
uint32_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   826
ql_forced_disable_completion_interrupt(qlge_t *qlge, uint32_t intr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   827
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   828
	uint32_t var = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   829
	struct intr_ctx *ctx = qlge->intr_ctx + intr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   830
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   831
	QL_PRINT(DBG_INTR, ("%s(%d): To disable intr %d, irq_cnt %d \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   832
	    __func__, qlge->instance, intr, ctx->irq_cnt));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   833
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   834
	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && intr) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   835
		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   836
		var = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   837
		return (var);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   838
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   839
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   840
	mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   841
	ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   842
	var = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   843
	mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   844
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   845
	return (var);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   846
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   847
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   848
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   849
 * Disable a completion interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   850
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   851
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   852
ql_disable_completion_interrupt(qlge_t *qlge, uint32_t intr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   853
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   854
	struct intr_ctx *ctx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   855
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   856
	ctx = qlge->intr_ctx + intr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   857
	QL_PRINT(DBG_INTR, ("%s(%d): To disable intr %d, irq_cnt %d \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   858
	    __func__, qlge->instance, intr, ctx->irq_cnt));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   859
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   860
	 * HW disables for us if we're MSIX multi interrupts and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   861
	 * it's not the default (zeroeth) interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   862
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   863
	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && (intr != 0))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   864
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   865
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   866
	if (ql_atomic_read_32(&ctx->irq_cnt) == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   867
		mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   868
		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   869
		mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   870
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   871
	atomic_inc_32(&ctx->irq_cnt);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   872
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   873
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   874
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   875
 * Enable all completion interrupts
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   876
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   877
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   878
ql_enable_all_completion_interrupts(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   879
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   880
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   881
	uint32_t value = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   882
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   883
	for (i = 0; i < qlge->intr_cnt; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   884
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   885
		 * Set the count to 1 for Legacy / MSI interrupts or for the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   886
		 * default interrupt (0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   887
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   888
		if ((qlge->intr_type != DDI_INTR_TYPE_MSIX) || i == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   889
			ql_atomic_set_32(&qlge->intr_ctx[i].irq_cnt, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   890
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   891
		ql_enable_completion_interrupt(qlge, i);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   892
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   893
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   894
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   895
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   896
 * Disable all completion interrupts
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   897
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   898
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   899
ql_disable_all_completion_interrupts(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   900
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   901
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   902
	uint32_t value = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   903
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   904
	for (i = 0; i < qlge->intr_cnt; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   905
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   906
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   907
		 * Set the count to 0 for Legacy / MSI interrupts or for the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   908
		 * default interrupt (0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   909
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   910
		if ((qlge->intr_type != DDI_INTR_TYPE_MSIX) || i == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   911
			ql_atomic_set_32(&qlge->intr_ctx[i].irq_cnt, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   912
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   913
		ql_disable_completion_interrupt(qlge, i);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   914
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   915
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   916
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   917
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   918
 * Update small buffer queue producer index
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   919
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   920
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   921
ql_update_sbq_prod_idx(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   922
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   923
	/* Update the buffer producer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   924
	QL_PRINT(DBG_RX, ("sbq: updating prod idx = %d.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   925
	    rx_ring->sbq_prod_idx));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   926
	ql_write_doorbell_reg(qlge, rx_ring->sbq_prod_idx_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   927
	    rx_ring->sbq_prod_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   928
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   929
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   930
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   931
 * Update large buffer queue producer index
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   932
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   933
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   934
ql_update_lbq_prod_idx(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   935
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   936
	/* Update the buffer producer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   937
	QL_PRINT(DBG_RX, ("lbq: updating prod idx = %d.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   938
	    rx_ring->lbq_prod_idx));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   939
	ql_write_doorbell_reg(qlge, rx_ring->lbq_prod_idx_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   940
	    rx_ring->lbq_prod_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   941
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   942
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   943
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   944
 * Adds a small buffer descriptor to end of its in use list,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   945
 * assumes sbq_lock is already taken
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   946
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   947
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   948
ql_add_sbuf_to_in_use_list(struct rx_ring *rx_ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   949
    struct bq_desc *sbq_desc)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   950
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   951
	uint32_t inuse_idx = rx_ring->sbq_use_tail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   952
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   953
	rx_ring->sbuf_in_use[inuse_idx] = sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   954
	inuse_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   955
	if (inuse_idx >= rx_ring->sbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   956
		inuse_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   957
	rx_ring->sbq_use_tail = inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   958
	atomic_inc_32(&rx_ring->sbuf_in_use_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   959
	ASSERT(rx_ring->sbuf_in_use_count <= rx_ring->sbq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   960
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   961
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   962
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   963
 * Get a small buffer descriptor from its in use list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   964
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   965
static struct bq_desc *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   966
ql_get_sbuf_from_in_use_list(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   967
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   968
	struct bq_desc *sbq_desc = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   969
	uint32_t inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   970
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   971
	/* Pick from head of in use list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   972
	inuse_idx = rx_ring->sbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   973
	sbq_desc = rx_ring->sbuf_in_use[inuse_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   974
	rx_ring->sbuf_in_use[inuse_idx] = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   975
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   976
	if (sbq_desc != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   977
		inuse_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   978
		if (inuse_idx >= rx_ring->sbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   979
			inuse_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   980
		rx_ring->sbq_use_head = inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   981
		atomic_dec_32(&rx_ring->sbuf_in_use_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   982
		atomic_inc_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   983
		sbq_desc->upl_inuse = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   984
		/* if mp is NULL */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   985
		if (sbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   986
			/* try to remap mp again */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   987
			sbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   988
			    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   989
			    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   990
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   991
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   992
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   993
	return (sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   994
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   995
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   996
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   997
 * Add a small buffer descriptor to its free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   998
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
   999
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1000
ql_add_sbuf_to_free_list(struct rx_ring *rx_ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1001
    struct bq_desc *sbq_desc)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1002
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1003
	uint32_t free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1004
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1005
	/* Add to the end of free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1006
	free_idx = rx_ring->sbq_free_tail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1007
	rx_ring->sbuf_free[free_idx] = sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1008
	ASSERT(rx_ring->sbuf_free_count <= rx_ring->sbq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1009
	free_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1010
	if (free_idx >= rx_ring->sbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1011
		free_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1012
	rx_ring->sbq_free_tail = free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1013
	atomic_inc_32(&rx_ring->sbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1014
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1015
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1016
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1017
 * Get a small buffer descriptor from its free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1018
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1019
static struct bq_desc *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1020
ql_get_sbuf_from_free_list(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1021
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1022
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1023
	uint32_t free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1024
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1025
	free_idx = rx_ring->sbq_free_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1026
	/* Pick from top of free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1027
	sbq_desc = rx_ring->sbuf_free[free_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1028
	rx_ring->sbuf_free[free_idx] = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1029
	if (sbq_desc != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1030
		free_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1031
		if (free_idx >= rx_ring->sbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1032
			free_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1033
		rx_ring->sbq_free_head = free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1034
		atomic_dec_32(&rx_ring->sbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1035
		ASSERT(rx_ring->sbuf_free_count != 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1036
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1037
	return (sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1038
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1039
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1040
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1041
 * Add a large buffer descriptor to its in use list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1042
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1043
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1044
ql_add_lbuf_to_in_use_list(struct rx_ring *rx_ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1045
    struct bq_desc *lbq_desc)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1046
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1047
	uint32_t inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1048
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1049
	inuse_idx = rx_ring->lbq_use_tail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1050
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1051
	rx_ring->lbuf_in_use[inuse_idx] = lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1052
	inuse_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1053
	if (inuse_idx >= rx_ring->lbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1054
		inuse_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1055
	rx_ring->lbq_use_tail = inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1056
	atomic_inc_32(&rx_ring->lbuf_in_use_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1057
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1058
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1059
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1060
 * Get a large buffer descriptor from in use list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1061
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1062
static struct bq_desc *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1063
ql_get_lbuf_from_in_use_list(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1064
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1065
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1066
	uint32_t inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1067
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1068
	/* Pick from head of in use list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1069
	inuse_idx = rx_ring->lbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1070
	lbq_desc = rx_ring->lbuf_in_use[inuse_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1071
	rx_ring->lbuf_in_use[inuse_idx] = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1072
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1073
	if (lbq_desc != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1074
		inuse_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1075
		if (inuse_idx >= rx_ring->lbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1076
			inuse_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1077
		rx_ring->lbq_use_head = inuse_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1078
		atomic_dec_32(&rx_ring->lbuf_in_use_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1079
		atomic_inc_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1080
		lbq_desc->upl_inuse = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1081
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1082
		/* if mp is NULL */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1083
		if (lbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1084
			/* try to remap mp again */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1085
			lbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1086
			    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1087
			    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1088
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1089
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1090
	return (lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1091
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1092
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1093
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1094
 * Add a large buffer descriptor to free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1095
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1096
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1097
ql_add_lbuf_to_free_list(struct rx_ring *rx_ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1098
    struct bq_desc *lbq_desc)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1099
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1100
	uint32_t free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1101
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1102
	/* Add to the end of free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1103
	free_idx = rx_ring->lbq_free_tail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1104
	rx_ring->lbuf_free[free_idx] = lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1105
	free_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1106
	if (free_idx >= rx_ring->lbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1107
		free_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1108
	rx_ring->lbq_free_tail = free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1109
	atomic_inc_32(&rx_ring->lbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1110
	ASSERT(rx_ring->lbuf_free_count <= rx_ring->lbq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1111
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1112
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1113
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1114
 * Get a large buffer descriptor from its free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1115
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1116
static struct bq_desc *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1117
ql_get_lbuf_from_free_list(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1118
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1119
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1120
	uint32_t free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1121
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1122
	free_idx = rx_ring->lbq_free_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1123
	/* Pick from head of free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1124
	lbq_desc = rx_ring->lbuf_free[free_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1125
	rx_ring->lbuf_free[free_idx] = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1126
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1127
	if (lbq_desc != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1128
		free_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1129
		if (free_idx >= rx_ring->lbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1130
			free_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1131
		rx_ring->lbq_free_head = free_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1132
		atomic_dec_32(&rx_ring->lbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1133
		ASSERT(rx_ring->lbuf_free_count != 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1134
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1135
	return (lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1136
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1137
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1138
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1139
 * Add a small buffer descriptor to free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1140
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1141
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1142
ql_refill_sbuf_free_list(struct bq_desc *sbq_desc, boolean_t alloc_memory)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1143
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1144
	struct rx_ring *rx_ring = sbq_desc->rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1145
	uint64_t *sbq_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1146
	qlge_t *qlge = (qlge_t *)rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1147
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1148
	 * Sync access
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1149
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1150
	mutex_enter(&rx_ring->sbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1151
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1152
	sbq_desc->upl_inuse = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1153
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1154
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1155
	 * If we are freeing the buffers as a result of adapter unload, get out
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1156
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1157
	if ((sbq_desc->free_buf != NULL) ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1158
	    (qlge->mac_flags == QL_MAC_DETACH)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1159
		if (sbq_desc->free_buf == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1160
			atomic_dec_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1161
		mutex_exit(&rx_ring->sbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1162
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1163
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1164
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1165
	if (rx_ring->rx_indicate == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1166
		cmn_err(CE_WARN, "sbq: indicate wrong");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1167
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1168
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1169
	uint32_t sb_consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1170
	uint32_t sb_producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1171
	uint32_t num_free_buffers;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1172
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1173
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1174
	temp = ql_read_doorbell_reg(qlge, rx_ring->sbq_prod_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1175
	sb_producer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1176
	sb_consumer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1177
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1178
	if (sb_consumer_idx > sb_producer_idx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1179
		num_free_buffers = NUM_SMALL_BUFFERS -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1180
		    (sb_consumer_idx - sb_producer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1181
	else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1182
		num_free_buffers = sb_producer_idx - sb_consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1183
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1184
	if (num_free_buffers < qlge->rx_sb_low_count[rx_ring->cq_id])
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1185
		qlge->rx_sb_low_count[rx_ring->cq_id] = num_free_buffers;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1186
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1187
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1188
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1189
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1190
	if (rx_ring->rx_indicate > 0xFF000000)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1191
		cmn_err(CE_WARN, "sbq: indicate(%d) wrong: %d mac_flags %d,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1192
		    " sbq_desc index %d.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1193
		    rx_ring->cq_id, rx_ring->rx_indicate, rx_ring->mac_flags,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1194
		    sbq_desc->index);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1195
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1196
	if (alloc_memory) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1197
		sbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1198
		    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1199
		    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1200
		if (sbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1201
			rx_ring->rx_failed_sbq_allocs++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1202
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1203
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1204
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1205
	/* Got the packet from the stack decrement rx_indicate count */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1206
	atomic_dec_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1207
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1208
	ql_add_sbuf_to_free_list(rx_ring, sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1209
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1210
	/* Rearm if possible */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1211
	if ((rx_ring->sbuf_free_count >= MIN_BUFFERS_FREE_COUNT) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1212
	    (qlge->mac_flags == QL_MAC_STARTED)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1213
		sbq_entry = rx_ring->sbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1214
		sbq_entry += rx_ring->sbq_prod_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1215
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1216
		while (rx_ring->sbuf_free_count > MIN_BUFFERS_ARM_COUNT) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1217
			/* Get first one from free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1218
			sbq_desc = ql_get_sbuf_from_free_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1219
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1220
			*sbq_entry = cpu_to_le64(sbq_desc->bd_dma.dma_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1221
			sbq_entry++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1222
			rx_ring->sbq_prod_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1223
			if (rx_ring->sbq_prod_idx >= rx_ring->sbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1224
				rx_ring->sbq_prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1225
				sbq_entry = rx_ring->sbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1226
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1227
			/* Add to end of in use list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1228
			ql_add_sbuf_to_in_use_list(rx_ring, sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1229
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1230
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1231
		/* Update small buffer queue producer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1232
		ql_update_sbq_prod_idx(qlge, rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1233
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1234
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1235
	mutex_exit(&rx_ring->sbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1236
	QL_PRINT(DBG_RX_RING, ("%s(%d) exited, sbuf_free_count %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1237
	    __func__, qlge->instance, rx_ring->sbuf_free_count));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1238
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1239
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1240
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1241
 * rx recycle call back function
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1242
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1243
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1244
ql_release_to_sbuf_free_list(caddr_t p)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1245
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1246
	struct bq_desc *sbq_desc = (struct bq_desc *)(void *)p;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1247
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1248
	if (sbq_desc == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1249
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1250
	ql_refill_sbuf_free_list(sbq_desc, B_TRUE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1251
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1252
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1253
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1254
 * Add a large buffer descriptor to free list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1255
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1256
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1257
ql_refill_lbuf_free_list(struct bq_desc *lbq_desc, boolean_t alloc_memory)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1258
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1259
	struct rx_ring *rx_ring = lbq_desc->rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1260
	uint64_t *lbq_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1261
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1262
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1263
	/* Sync access */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1264
	mutex_enter(&rx_ring->lbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1265
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1266
	lbq_desc->upl_inuse = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1267
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1268
	 * If we are freeing the buffers as a result of adapter unload, get out
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1269
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1270
	if ((lbq_desc->free_buf != NULL) ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1271
	    (qlge->mac_flags == QL_MAC_DETACH)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1272
		if (lbq_desc->free_buf == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1273
			atomic_dec_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1274
		mutex_exit(&rx_ring->lbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1275
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1276
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1277
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1278
	if (rx_ring->rx_indicate == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1279
		cmn_err(CE_WARN, "lbq: indicate wrong");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1280
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1281
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1282
	uint32_t lb_consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1283
	uint32_t lb_producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1284
	uint32_t num_free_buffers;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1285
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1286
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1287
	temp = ql_read_doorbell_reg(qlge, rx_ring->lbq_prod_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1288
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1289
	lb_producer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1290
	lb_consumer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1291
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1292
	if (lb_consumer_idx > lb_producer_idx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1293
		num_free_buffers = NUM_LARGE_BUFFERS -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1294
		    (lb_consumer_idx - lb_producer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1295
	else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1296
		num_free_buffers = lb_producer_idx - lb_consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1297
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1298
	if (num_free_buffers < qlge->rx_lb_low_count[rx_ring->cq_id]) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1299
		qlge->rx_lb_low_count[rx_ring->cq_id] = num_free_buffers;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1300
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1301
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1302
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1303
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1304
	if (rx_ring->rx_indicate > 0xFF000000)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1305
		cmn_err(CE_WARN, "lbq: indicate(%d) wrong: %d mac_flags %d,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1306
		    "lbq_desc index %d",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1307
		    rx_ring->cq_id, rx_ring->rx_indicate, rx_ring->mac_flags,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1308
		    lbq_desc->index);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1309
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1310
	if (alloc_memory) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1311
		lbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1312
		    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1313
		    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1314
		if (lbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1315
			rx_ring->rx_failed_lbq_allocs++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1316
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1317
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1318
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1319
	/* Got the packet from the stack decrement rx_indicate count */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1320
	atomic_dec_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1321
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1322
	ql_add_lbuf_to_free_list(rx_ring, lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1323
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1324
	/* Rearm if possible */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1325
	if ((rx_ring->lbuf_free_count >= MIN_BUFFERS_FREE_COUNT) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1326
	    (qlge->mac_flags == QL_MAC_STARTED)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1327
		lbq_entry = rx_ring->lbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1328
		lbq_entry += rx_ring->lbq_prod_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1329
		while (rx_ring->lbuf_free_count > MIN_BUFFERS_ARM_COUNT) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1330
			/* Get first one from free list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1331
			lbq_desc = ql_get_lbuf_from_free_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1332
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1333
			*lbq_entry = cpu_to_le64(lbq_desc->bd_dma.dma_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1334
			lbq_entry++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1335
			rx_ring->lbq_prod_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1336
			if (rx_ring->lbq_prod_idx >= rx_ring->lbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1337
				rx_ring->lbq_prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1338
				lbq_entry = rx_ring->lbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1339
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1340
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1341
			/* Add to end of in use list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1342
			ql_add_lbuf_to_in_use_list(rx_ring, lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1343
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1344
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1345
		/* Update large buffer queue producer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1346
		ql_update_lbq_prod_idx(rx_ring->qlge, rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1347
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1348
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1349
	mutex_exit(&rx_ring->lbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1350
	QL_PRINT(DBG_RX_RING, ("%s exitd, lbuf_free_count %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1351
	    __func__, rx_ring->lbuf_free_count));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1352
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1353
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1354
 * rx recycle call back function
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1355
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1356
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1357
ql_release_to_lbuf_free_list(caddr_t p)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1358
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1359
	struct bq_desc *lbq_desc = (struct bq_desc *)(void *)p;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1360
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1361
	if (lbq_desc == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1362
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1363
	ql_refill_lbuf_free_list(lbq_desc, B_TRUE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1364
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1365
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1366
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1367
 * free small buffer queue buffers
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1368
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1369
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1370
ql_free_sbq_buffers(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1371
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1372
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1373
	uint32_t i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1374
	uint32_t j = rx_ring->sbq_free_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1375
	int  force_cnt = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1376
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1377
	for (i = 0; i < rx_ring->sbuf_free_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1378
		sbq_desc = rx_ring->sbuf_free[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1379
		sbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1380
		j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1381
		if (j >= rx_ring->sbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1382
			j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1383
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1384
		if (sbq_desc->mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1385
			freemsg(sbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1386
			sbq_desc->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1387
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1388
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1389
	rx_ring->sbuf_free_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1390
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1391
	j = rx_ring->sbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1392
	for (i = 0; i < rx_ring->sbuf_in_use_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1393
		sbq_desc = rx_ring->sbuf_in_use[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1394
		sbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1395
		j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1396
		if (j >= rx_ring->sbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1397
			j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1398
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1399
		if (sbq_desc->mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1400
			freemsg(sbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1401
			sbq_desc->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1402
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1403
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1404
	rx_ring->sbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1405
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1406
	sbq_desc = &rx_ring->sbq_desc[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1407
	for (i = 0; i < rx_ring->sbq_len; i++, sbq_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1408
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1409
		 * Set flag so that the callback does not allocate a new buffer
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1410
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1411
		sbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1412
		if (sbq_desc->upl_inuse != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1413
			force_cnt++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1414
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1415
		if (sbq_desc->bd_dma.dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1416
			ql_free_phys(&sbq_desc->bd_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1417
			    &sbq_desc->bd_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1418
			sbq_desc->bd_dma.dma_handle = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1419
			sbq_desc->bd_dma.acc_handle = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1420
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1421
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1422
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1423
	cmn_err(CE_NOTE, "sbq: free %d inuse %d force %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1424
	    rx_ring->sbuf_free_count, rx_ring->sbuf_in_use_count, force_cnt);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1425
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1426
	if (rx_ring->sbuf_in_use != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1427
		kmem_free(rx_ring->sbuf_in_use, (rx_ring->sbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1428
		    sizeof (struct bq_desc *)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1429
		rx_ring->sbuf_in_use = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1430
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1431
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1432
	if (rx_ring->sbuf_free != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1433
		kmem_free(rx_ring->sbuf_free, (rx_ring->sbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1434
		    sizeof (struct bq_desc *)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1435
		rx_ring->sbuf_free = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1436
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1437
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1438
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1439
/* Allocate small buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1440
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1441
ql_alloc_sbufs(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1442
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1443
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1444
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1445
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1446
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1447
	rx_ring->sbuf_free = kmem_zalloc(rx_ring->sbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1448
	    sizeof (struct bq_desc *), KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1449
	if (rx_ring->sbuf_free == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1450
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1451
		    "!%s: sbuf_free_list alloc: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1452
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1453
		rx_ring->sbuf_free_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1454
		goto alloc_sbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1455
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1456
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1457
	rx_ring->sbuf_in_use = kmem_zalloc(rx_ring->sbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1458
	    sizeof (struct bq_desc *), KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1459
	if (rx_ring->sbuf_in_use == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1460
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1461
		    "!%s: sbuf_inuse_list alloc: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1462
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1463
		rx_ring->sbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1464
		goto alloc_sbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1465
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1466
	rx_ring->sbq_use_head = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1467
	rx_ring->sbq_use_tail = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1468
	rx_ring->sbq_free_head = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1469
	rx_ring->sbq_free_tail = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1470
	sbq_desc = &rx_ring->sbq_desc[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1471
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1472
	for (i = 0; i < rx_ring->sbq_len; i++, sbq_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1473
		/* Allocate buffer */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1474
		if (ql_alloc_phys_rbuf(qlge->dip, &sbq_desc->bd_dma.dma_handle,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1475
		    &ql_buf_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1476
		    DDI_DMA_READ | DDI_DMA_STREAMING,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1477
		    &sbq_desc->bd_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1478
		    (size_t)rx_ring->sbq_buf_size,	/* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1479
		    (size_t)0,				/* default alignment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1480
		    (caddr_t *)&sbq_desc->bd_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1481
		    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1482
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1483
			    "!%s: ddi_dma_alloc_handle: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1484
			    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1485
			goto alloc_sbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1486
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1487
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1488
		/* Set context for Return buffer callback */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1489
		sbq_desc->bd_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1490
		sbq_desc->rx_recycle.free_func = ql_release_to_sbuf_free_list;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1491
		sbq_desc->rx_recycle.free_arg  = (caddr_t)sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1492
		sbq_desc->rx_ring = rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1493
		sbq_desc->upl_inuse = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1494
		sbq_desc->free_buf = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1495
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1496
		sbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1497
		    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1498
		    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1499
		if (sbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1500
			cmn_err(CE_WARN, "%s: desballoc() failed", __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1501
			goto alloc_sbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1502
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1503
		ql_add_sbuf_to_free_list(rx_ring, sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1504
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1505
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1506
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1507
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1508
alloc_sbuf_err:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1509
	ql_free_sbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1510
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1511
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1512
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1513
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1514
ql_free_lbq_buffers(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1515
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1516
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1517
	uint32_t i, j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1518
	int force_cnt = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1519
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1520
	j = rx_ring->lbq_free_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1521
	for (i = 0; i < rx_ring->lbuf_free_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1522
		lbq_desc = rx_ring->lbuf_free[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1523
		lbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1524
		j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1525
		if (j >= rx_ring->lbq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1526
			j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1527
		if (lbq_desc->mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1528
			freemsg(lbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1529
			lbq_desc->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1530
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1531
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1532
	rx_ring->lbuf_free_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1533
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1534
	j = rx_ring->lbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1535
	for (i = 0; i < rx_ring->lbuf_in_use_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1536
		lbq_desc = rx_ring->lbuf_in_use[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1537
		lbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1538
		j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1539
		if (j >= rx_ring->lbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1540
			j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1541
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1542
		if (lbq_desc->mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1543
			freemsg(lbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1544
			lbq_desc->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1545
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1546
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1547
	rx_ring->lbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1548
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1549
	lbq_desc = &rx_ring->lbq_desc[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1550
	for (i = 0; i < rx_ring->lbq_len; i++, lbq_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1551
		/* Set flag so that callback will not allocate a new buffer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1552
		lbq_desc->free_buf = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1553
		if (lbq_desc->upl_inuse != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1554
			force_cnt++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1555
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1556
		if (lbq_desc->bd_dma.dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1557
			ql_free_phys(&lbq_desc->bd_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1558
			    &lbq_desc->bd_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1559
			lbq_desc->bd_dma.dma_handle = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1560
			lbq_desc->bd_dma.acc_handle = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1561
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1562
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1563
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1564
	if (force_cnt) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1565
		cmn_err(CE_WARN, "lbq: free %d inuse %d force %d",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1566
		    rx_ring->lbuf_free_count, rx_ring->lbuf_in_use_count,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1567
		    force_cnt);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1568
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1569
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1570
	if (rx_ring->lbuf_in_use != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1571
		kmem_free(rx_ring->lbuf_in_use, (rx_ring->lbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1572
		    sizeof (struct bq_desc *)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1573
		rx_ring->lbuf_in_use = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1574
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1575
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1576
	if (rx_ring->lbuf_free != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1577
		kmem_free(rx_ring->lbuf_free, (rx_ring->lbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1578
		    sizeof (struct bq_desc *)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1579
		rx_ring->lbuf_free = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1580
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1581
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1582
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1583
/* Allocate large buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1584
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1585
ql_alloc_lbufs(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1586
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1587
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1588
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1589
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1590
	uint32_t lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1591
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1592
	rx_ring->lbuf_free = kmem_zalloc(rx_ring->lbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1593
	    sizeof (struct bq_desc *), KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1594
	if (rx_ring->lbuf_free == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1595
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1596
		    "!%s: lbuf_free_list alloc: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1597
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1598
		rx_ring->lbuf_free_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1599
		goto alloc_lbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1600
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1601
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1602
	rx_ring->lbuf_in_use = kmem_zalloc(rx_ring->lbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1603
	    sizeof (struct bq_desc *), KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1604
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1605
	if (rx_ring->lbuf_in_use == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1606
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1607
		    "!%s: lbuf_inuse_list alloc: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1608
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1609
		rx_ring->lbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1610
		goto alloc_lbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1611
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1612
	rx_ring->lbq_use_head = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1613
	rx_ring->lbq_use_tail = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1614
	rx_ring->lbq_free_head = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1615
	rx_ring->lbq_free_tail = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1616
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1617
	lbq_buf_size = (qlge->mtu == ETHERMTU) ?
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1618
	    LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1619
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1620
	lbq_desc = &rx_ring->lbq_desc[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1621
	for (i = 0; i < rx_ring->lbq_len; i++, lbq_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1622
		rx_ring->lbq_buf_size = lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1623
		/* Allocate buffer */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1624
		if (ql_alloc_phys_rbuf(qlge->dip, &lbq_desc->bd_dma.dma_handle,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1625
		    &ql_buf_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1626
		    DDI_DMA_READ | DDI_DMA_STREAMING,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1627
		    &lbq_desc->bd_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1628
		    (size_t)rx_ring->lbq_buf_size,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1629
		    (size_t)0, /* default alignment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1630
		    (caddr_t *)&lbq_desc->bd_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1631
		    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1632
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1633
			    "!%s: ddi_dma_alloc_handle: failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1634
			    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1635
			goto alloc_lbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1636
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1637
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1638
		/* Set context for Return buffer callback */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1639
		lbq_desc->bd_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1640
		lbq_desc->rx_recycle.free_func = ql_release_to_lbuf_free_list;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1641
		lbq_desc->rx_recycle.free_arg  = (caddr_t)lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1642
		lbq_desc->rx_ring = rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1643
		lbq_desc->upl_inuse = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1644
		lbq_desc->free_buf = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1645
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1646
		lbq_desc->mp =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1647
		    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1648
		    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1649
		if (lbq_desc->mp == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1650
			cmn_err(CE_WARN, "%s: desballoc() failed", __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1651
			goto alloc_lbuf_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1652
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1653
		ql_add_lbuf_to_free_list(rx_ring, lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1654
	} /* For all large buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1655
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1656
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1657
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1658
alloc_lbuf_err:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1659
	ql_free_lbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1660
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1661
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1662
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1663
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1664
 * Free rx buffers
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1665
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1666
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1667
ql_free_rx_buffers(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1668
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1669
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1670
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1671
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1672
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1673
		rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1674
		if (rx_ring->type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1675
			ql_free_lbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1676
			ql_free_sbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1677
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1678
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1679
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1680
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1681
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1682
 * Allocate rx buffers
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1683
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1684
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1685
ql_alloc_rx_buffers(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1686
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1687
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1688
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1689
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1690
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1691
		rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1692
		if (rx_ring->type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1693
			if (ql_alloc_sbufs(qlge, rx_ring) != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1694
				goto alloc_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1695
			if (ql_alloc_lbufs(qlge, rx_ring) != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1696
				goto alloc_err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1697
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1698
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1699
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1700
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1701
		if (qlge->rx_ring[i].type == RX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1702
			qlge->rx_sb_low_count[i] = NUM_SMALL_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1703
			qlge->rx_lb_low_count[i] = NUM_LARGE_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1704
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1705
		qlge->cq_low_count[i] = NUM_RX_RING_ENTRIES;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1706
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1707
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1708
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1709
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1710
alloc_err:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1711
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1712
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1713
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1714
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1715
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1716
 * Initialize large buffer queue ring
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1717
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1718
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1719
ql_init_lbq_ring(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1720
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1721
	uint16_t i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1722
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1723
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1724
	bzero(rx_ring->lbq_desc, rx_ring->lbq_len * sizeof (struct bq_desc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1725
	for (i = 0; i < rx_ring->lbq_len; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1726
		lbq_desc = &rx_ring->lbq_desc[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1727
		lbq_desc->index = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1728
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1729
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1730
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1731
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1732
 * Initialize small buffer queue ring
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1733
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1734
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1735
ql_init_sbq_ring(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1736
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1737
	uint16_t i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1738
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1739
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1740
	bzero(rx_ring->sbq_desc, rx_ring->sbq_len * sizeof (struct bq_desc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1741
	for (i = 0; i < rx_ring->sbq_len; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1742
		sbq_desc = &rx_ring->sbq_desc[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1743
		sbq_desc->index = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1744
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1745
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1746
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1747
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1748
 * Calculate the pseudo-header checksum if hardware can not do
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1749
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1750
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1751
ql_pseudo_cksum(uint8_t *buf)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1752
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1753
	uint32_t cksum;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1754
	uint16_t iphl;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1755
	uint16_t proto;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1756
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1757
	iphl = (uint16_t)(4 * (buf[0] & 0xF));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1758
	cksum = (((uint16_t)buf[2])<<8) + buf[3] - iphl;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1759
	cksum += proto = buf[9];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1760
	cksum += (((uint16_t)buf[12])<<8) + buf[13];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1761
	cksum += (((uint16_t)buf[14])<<8) + buf[15];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1762
	cksum += (((uint16_t)buf[16])<<8) + buf[17];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1763
	cksum += (((uint16_t)buf[18])<<8) + buf[19];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1764
	cksum = (cksum>>16) + (cksum & 0xFFFF);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1765
	cksum = (cksum>>16) + (cksum & 0xFFFF);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1766
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1767
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1768
	 * Point it to the TCP/UDP header, and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1769
	 * update the checksum field.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1770
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1771
	buf += iphl + ((proto == IPPROTO_TCP) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1772
	    TCP_CKSUM_OFFSET : UDP_CKSUM_OFFSET);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1773
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1774
	*(uint16_t *)(void *)buf = (uint16_t)htons((uint16_t)cksum);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1775
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1776
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1777
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1778
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1779
 * Transmit an incoming packet.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1780
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1781
mblk_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1782
ql_ring_tx(void *arg, mblk_t *mp)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1783
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1784
	struct tx_ring *tx_ring = (struct tx_ring *)arg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1785
	qlge_t *qlge = tx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1786
	mblk_t *next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1787
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1788
	uint32_t tx_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1789
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1790
	if (qlge->port_link_state == LS_DOWN) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1791
		/* can not send message while link is down */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1792
		mblk_t *tp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1793
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1794
		while (mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1795
			tp = mp->b_next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1796
			mp->b_next = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1797
			freemsg(mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1798
			mp = tp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1799
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1800
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1801
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1802
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1803
	mutex_enter(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1804
	/* if mac is not started, driver is not ready, can not send */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1805
	if (tx_ring->mac_flags != QL_MAC_STARTED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1806
		cmn_err(CE_WARN, "%s(%d)ring not started, mode %d "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1807
		    " return packets",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1808
		    __func__, qlge->instance, tx_ring->mac_flags);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1809
		mutex_exit(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1810
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1811
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1812
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1813
	/* we must try to send all */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1814
	while (mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1815
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1816
		 * if number of available slots is less than a threshold,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1817
		 * then quit
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1818
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1819
		if (tx_ring->tx_free_count <= TX_STOP_THRESHOLD) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1820
			tx_ring->queue_stopped = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1821
			rval = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1822
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1823
			cmn_err(CE_WARN, "%s(%d) no resources",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1824
			    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1825
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1826
			tx_ring->defer++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1827
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1828
			 * If we return the buffer back we are expected to call
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1829
			 * mac_tx_ring_update() when resources are available
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1830
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1831
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1832
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1833
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1834
		next = mp->b_next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1835
		mp->b_next = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1836
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1837
		rval = ql_send_common(tx_ring, mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1838
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1839
		if (rval != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1840
			mp->b_next = next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1841
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1842
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1843
		tx_count++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1844
		mp = next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1845
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1846
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1847
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1848
	 * After all msg blocks are mapped or copied to tx buffer,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1849
	 * trigger the hardware to send!
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1850
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1851
	if (tx_count > 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1852
		ql_write_doorbell_reg(tx_ring->qlge, tx_ring->prod_idx_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1853
		    tx_ring->prod_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1854
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1855
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1856
	mutex_exit(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1857
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1858
	return (mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1859
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1860
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1861
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1862
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1863
 * This function builds an mblk list for the given inbound
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1864
 * completion.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1865
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1866
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1867
static mblk_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1868
ql_build_rx_mp(qlge_t *qlge, struct rx_ring *rx_ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1869
    struct ib_mac_iocb_rsp *ib_mac_rsp)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1870
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1871
	mblk_t *mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1872
	mblk_t *mp1 = NULL;	/* packet header */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1873
	mblk_t *mp2 = NULL;	/* packet content */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1874
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1875
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1876
	uint32_t err_flag = (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1877
	uint32_t payload_len = le32_to_cpu(ib_mac_rsp->data_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1878
	uint32_t header_len = le32_to_cpu(ib_mac_rsp->hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1879
	uint32_t pkt_len = payload_len + header_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1880
	uint32_t done;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1881
	uint64_t *curr_ial_ptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1882
	uint32_t ial_data_addr_low;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1883
	uint32_t actual_data_addr_low;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1884
	mblk_t *mp_ial = NULL;	/* ial chained packets */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1885
	uint32_t size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1886
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1887
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1888
	 * Check if error flags are set
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1889
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1890
	if (err_flag != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1891
		if ((err_flag & IB_MAC_IOCB_RSP_ERR_OVERSIZE) != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1892
			rx_ring->frame_too_long++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1893
		if ((err_flag & IB_MAC_IOCB_RSP_ERR_UNDERSIZE) != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1894
			rx_ring->frame_too_short++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1895
		if ((err_flag & IB_MAC_IOCB_RSP_ERR_CRC) != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1896
			rx_ring->fcs_err++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1897
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1898
		cmn_err(CE_WARN, "bad packet, type 0x%x", err_flag);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1899
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1900
		QL_DUMP(DBG_RX, "qlge_ring_rx: bad response iocb dump\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1901
		    (uint8_t *)ib_mac_rsp, 8,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1902
		    (size_t)sizeof (struct ib_mac_iocb_rsp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1903
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1904
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1905
	/* header should not be in large buffer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1906
	if (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1907
		cmn_err(CE_WARN, "header in large buffer or invalid!");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1908
		err_flag |= 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1909
	}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1910
	/* if whole packet is too big than rx buffer size */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1911
	if (pkt_len > qlge->max_frame_size) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1912
		cmn_err(CE_WARN, "ql_build_rx_mpframe too long(%d)!", pkt_len);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1913
		err_flag |= 1;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1914
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1915
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1916
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1917
	 * Handle the header buffer if present.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1918
	 * packet header must be valid and saved in one small buffer
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1919
	 * broadcast/multicast packets' headers not splitted
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1920
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1921
	if ((ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1922
	    (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HS)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1923
		QL_PRINT(DBG_RX, ("Header of %d bytes in small buffer.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1924
		    header_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1925
		/* Sync access */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1926
		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1927
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1928
		ASSERT(sbq_desc != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1929
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1930
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1931
		 * Validate addresses from the ASIC with the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1932
		 * expected sbuf address
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1933
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1934
		if (cpu_to_le64(sbq_desc->bd_dma.dma_addr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1935
		    != ib_mac_rsp->hdr_addr) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1936
			/* Small buffer address mismatch */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1937
			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1938
			    " in wrong small buffer",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1939
			    __func__, qlge->instance, rx_ring->cq_id);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  1940
			goto fatal_error;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1941
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1942
		/* get this packet */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1943
		mp1 = sbq_desc->mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1944
		if ((err_flag != 0)|| (mp1 == NULL)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1945
			/* failed on this packet, put it back for re-arming */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1946
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1947
			cmn_err(CE_WARN, "get header from small buffer fail");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1948
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1949
			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1950
			mp1 = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1951
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1952
			/* Flush DMA'd data */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1953
			(void) ddi_dma_sync(sbq_desc->bd_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1954
			    0, header_len, DDI_DMA_SYNC_FORKERNEL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1955
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1956
			if ((qlge->ip_hdr_offset != 0)&&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1957
			    (header_len < SMALL_BUFFER_SIZE)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1958
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1959
				 * copy entire header to a 2 bytes boundary
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1960
				 * address for 8100 adapters so that the IP
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1961
				 * header can be on a 4 byte boundary address
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1962
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1963
				bcopy(mp1->b_rptr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1964
				    (mp1->b_rptr + SMALL_BUFFER_SIZE +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1965
				    qlge->ip_hdr_offset),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1966
				    header_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1967
				mp1->b_rptr += SMALL_BUFFER_SIZE +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1968
				    qlge->ip_hdr_offset;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1969
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1970
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1971
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1972
			 * Adjust the mp payload_len to match
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1973
			 * the packet header payload_len
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1974
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1975
			mp1->b_wptr = mp1->b_rptr + header_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1976
			mp1->b_next = mp1->b_cont = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1977
			QL_DUMP(DBG_RX, "\t RX packet header dump:\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1978
			    (uint8_t *)mp1->b_rptr, 8, header_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1979
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1980
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1981
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1982
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1983
	 * packet data or whole packet can be in small or one or
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1984
	 * several large buffer(s)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1985
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1986
	if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1987
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1988
		 * The data is in a single small buffer.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1989
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1990
		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1991
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1992
		ASSERT(sbq_desc != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1993
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1994
		QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1995
		    ("%d bytes in a single small buffer, sbq_desc = %p, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1996
		    "sbq_desc->bd_dma.dma_addr = %x,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1997
		    " ib_mac_rsp->data_addr = %x, mp = %p\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1998
		    payload_len, sbq_desc, sbq_desc->bd_dma.dma_addr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  1999
		    ib_mac_rsp->data_addr, sbq_desc->mp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2000
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2001
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2002
		 * Validate  addresses from the ASIC with the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2003
		 * expected sbuf address
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2004
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2005
		if (cpu_to_le64(sbq_desc->bd_dma.dma_addr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2006
		    != ib_mac_rsp->data_addr) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2007
			/* Small buffer address mismatch */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2008
			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2009
			    " in wrong small buffer",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2010
			    __func__, qlge->instance, rx_ring->cq_id);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2011
			goto fatal_error;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2012
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2013
		/* get this packet */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2014
		mp2 = sbq_desc->mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2015
		if ((err_flag != 0) || (mp2 == NULL)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2016
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2017
			/* failed on this packet, put it back for re-arming */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2018
			cmn_err(CE_WARN, "ignore bad data from small buffer");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2019
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2020
			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2021
			mp2 = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2022
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2023
			/* Adjust the buffer length to match the payload_len */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2024
			mp2->b_wptr = mp2->b_rptr + payload_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2025
			mp2->b_next = mp2->b_cont = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2026
			/* Flush DMA'd data */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2027
			(void) ddi_dma_sync(sbq_desc->bd_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2028
			    0, payload_len, DDI_DMA_SYNC_FORKERNEL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2029
			QL_DUMP(DBG_RX, "\t RX packet payload dump:\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2030
			    (uint8_t *)mp2->b_rptr, 8, payload_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2031
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2032
			 * if payload is too small , copy to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2033
			 * the end of packet header
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2034
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2035
			if ((mp1 != NULL) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2036
			    (payload_len <= qlge->payload_copy_thresh) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2037
			    (pkt_len <
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2038
			    (SMALL_BUFFER_SIZE - qlge->ip_hdr_offset))) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2039
				bcopy(mp2->b_rptr, mp1->b_wptr, payload_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2040
				mp1->b_wptr += payload_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2041
				freemsg(mp2);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2042
				mp2 = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2043
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2044
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2045
	} else if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2046
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2047
		 * The data is in a single large buffer.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2048
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2049
		lbq_desc = ql_get_lbuf_from_in_use_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2050
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2051
		QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2052
		    ("%d bytes in a single large buffer, lbq_desc = %p, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2053
		    "lbq_desc->bd_dma.dma_addr = %x,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2054
		    " ib_mac_rsp->data_addr = %x, mp = %p\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2055
		    payload_len, lbq_desc, lbq_desc->bd_dma.dma_addr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2056
		    ib_mac_rsp->data_addr, lbq_desc->mp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2057
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2058
		ASSERT(lbq_desc != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2059
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2060
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2061
		 * Validate  addresses from the ASIC with
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2062
		 * the expected lbuf address
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2063
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2064
		if (cpu_to_le64(lbq_desc->bd_dma.dma_addr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2065
		    != ib_mac_rsp->data_addr) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2066
			/* Large buffer address mismatch */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2067
			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2068
			    " in wrong large buffer",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2069
			    __func__, qlge->instance, rx_ring->cq_id);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2070
			goto fatal_error;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2071
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2072
		mp2 = lbq_desc->mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2073
		if ((err_flag != 0) || (mp2 == NULL)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2074
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2075
			cmn_err(CE_WARN, "ignore bad data from large buffer");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2076
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2077
			/* failed on this packet, put it back for re-arming */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2078
			ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2079
			mp2 = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2080
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2081
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2082
			 * Adjust the buffer length to match
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2083
			 * the packet payload_len
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2084
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2085
			mp2->b_wptr = mp2->b_rptr + payload_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2086
			mp2->b_next = mp2->b_cont = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2087
			/* Flush DMA'd data */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2088
			(void) ddi_dma_sync(lbq_desc->bd_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2089
			    0, payload_len, DDI_DMA_SYNC_FORKERNEL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2090
			QL_DUMP(DBG_RX, "\t RX packet payload dump:\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2091
			    (uint8_t *)mp2->b_rptr, 8, payload_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2092
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2093
			 * if payload is too small , copy to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2094
			 * the end of packet header
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2095
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2096
			if ((mp1 != NULL) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2097
			    (payload_len <= qlge->payload_copy_thresh) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2098
			    (pkt_len<
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2099
			    (SMALL_BUFFER_SIZE - qlge->ip_hdr_offset))) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2100
				bcopy(mp2->b_rptr, mp1->b_wptr, payload_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2101
				mp1->b_wptr += payload_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2102
				freemsg(mp2);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2103
				mp2 = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2104
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2105
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2106
	} else if (payload_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2107
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2108
		 * payload available but not in sml nor lrg buffer,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2109
		 * so, it is saved in IAL
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2110
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2111
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2112
		cmn_err(CE_NOTE, "packet chained in IAL \n");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2113
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2114
		/* lrg buf addresses are saved in one small buffer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2115
		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2116
		curr_ial_ptr = (uint64_t *)sbq_desc->bd_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2117
		done = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2118
		while (!done) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2119
			ial_data_addr_low =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2120
			    (uint32_t)(le64_to_cpu(*curr_ial_ptr) &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2121
			    0xFFFFFFFE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2122
			/* check if this is the last packet fragment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2123
			done = (uint32_t)(le64_to_cpu(*curr_ial_ptr) & 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2124
			curr_ial_ptr++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2125
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2126
			 * The data is in one or several large buffer(s).
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2127
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2128
			lbq_desc = ql_get_lbuf_from_in_use_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2129
			actual_data_addr_low =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2130
			    (uint32_t)(lbq_desc->bd_dma.dma_addr &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2131
			    0xFFFFFFFE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2132
			if (ial_data_addr_low != actual_data_addr_low) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2133
				cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2134
				    "packet saved in wrong ial lrg buffer"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2135
				    " expected %x, actual %lx",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2136
				    ial_data_addr_low,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2137
				    (uintptr_t)lbq_desc->bd_dma.dma_addr);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2138
				goto fatal_error;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2139
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2140
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2141
			size = (payload_len < rx_ring->lbq_buf_size)?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2142
			    payload_len : rx_ring->lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2143
			payload_len -= size;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2144
			mp2 = lbq_desc->mp;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2145
			if ((err_flag != 0) || (mp2 == NULL)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2146
#ifdef QLGE_LOAD_UNLOAD
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2147
				cmn_err(CE_WARN,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2148
				    "ignore bad data from large buffer");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2149
#endif
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2150
				ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2151
				mp2 = NULL;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2152
			} else {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2153
				if (mp_ial == NULL) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2154
					mp_ial = mp2;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2155
				} else {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2156
					linkb(mp_ial, mp2);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2157
				}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2158
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2159
				mp2->b_next = NULL;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2160
				mp2->b_cont = NULL;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2161
				mp2->b_wptr = mp2->b_rptr + size;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2162
				/* Flush DMA'd data */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2163
				(void) ddi_dma_sync(lbq_desc->bd_dma.dma_handle,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2164
				    0, size, DDI_DMA_SYNC_FORKERNEL);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2165
				QL_PRINT(DBG_RX, ("ial %d payload received \n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2166
				    size));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2167
				QL_DUMP(DBG_RX, "\t Mac data dump:\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2168
				    (uint8_t *)mp2->b_rptr, 8, size);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2169
			}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2170
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2171
		if (err_flag != 0) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2172
#ifdef QLGE_LOAD_UNLOAD
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2173
			/* failed on this packet, put it back for re-arming */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2174
			cmn_err(CE_WARN, "ignore bad data from small buffer");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2175
#endif
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2176
			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2177
		} else {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2178
			mp2 = mp_ial;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2179
			freemsg(sbq_desc->mp);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2180
		}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2181
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2182
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2183
	 * some packets' hdr not split, then send mp2 upstream, otherwise,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2184
	 * concatenate message block mp2 to the tail of message header, mp1
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2185
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2186
	if (!err_flag) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2187
		if (mp1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2188
			if (mp2) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2189
				QL_PRINT(DBG_RX, ("packet in mp1 and mp2\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2190
				linkb(mp1, mp2); /* mp1->b_cont = mp2; */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2191
				mp = mp1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2192
			} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2193
				QL_PRINT(DBG_RX, ("packet in mp1 only\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2194
				mp = mp1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2195
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2196
		} else if (mp2) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2197
			QL_PRINT(DBG_RX, ("packet in mp2 only\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2198
			mp = mp2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2199
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2200
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2201
	return (mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2202
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2203
fatal_error:
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2204
	/* fatal Error! */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2205
	if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2206
		ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2207
		ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2208
		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2209
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2210
	/* *mp->b_wptr = 0; */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2211
	ql_wake_asic_reset_soft_intr(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2212
	return (NULL);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2213
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2214
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2215
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2216
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2217
 * Bump completion queue consumer index.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2218
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2219
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2220
ql_update_cq(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2221
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2222
	rx_ring->cnsmr_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2223
	rx_ring->curr_entry++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2224
	if (rx_ring->cnsmr_idx >= rx_ring->cq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2225
		rx_ring->cnsmr_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2226
		rx_ring->curr_entry = rx_ring->cq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2227
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2228
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2229
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2230
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2231
 * Update completion queue consumer index.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2232
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2233
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2234
ql_write_cq_idx(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2235
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2236
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2237
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2238
	ql_write_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2239
	    rx_ring->cnsmr_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2240
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2241
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2242
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2243
 * Processes a SYS-Chip Event Notification Completion Event.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2244
 * The incoming notification event that describes a link up/down
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2245
 * or some sorts of error happens.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2246
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2247
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2248
ql_process_chip_ae_intr(qlge_t *qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2249
    struct ib_sys_event_iocb_rsp *ib_sys_event_rsp_ptr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2250
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2251
	uint8_t eventType = ib_sys_event_rsp_ptr->event_type;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2252
	uint32_t soft_req = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2253
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2254
	switch (eventType) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2255
		case SYS_EVENT_PORT_LINK_UP:	/* 0x0h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2256
			QL_PRINT(DBG_MBX, ("Port Link Up\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2257
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2258
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2259
		case SYS_EVENT_PORT_LINK_DOWN:	/* 0x1h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2260
			QL_PRINT(DBG_MBX, ("Port Link Down\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2261
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2262
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2263
		case SYS_EVENT_MULTIPLE_CAM_HITS : /* 0x6h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2264
			cmn_err(CE_WARN, "A multiple CAM hits look up error "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2265
			    "occurred");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2266
			soft_req |= NEED_HW_RESET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2267
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2268
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2269
		case SYS_EVENT_SOFT_ECC_ERR:	/* 0x7h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2270
			cmn_err(CE_WARN, "Soft ECC error detected");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2271
			soft_req |= NEED_HW_RESET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2272
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2273
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2274
		case SYS_EVENT_MGMT_FATAL_ERR:	/* 0x8h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2275
			cmn_err(CE_WARN, "Management (MPI) Processor fatal"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2276
			    " error occured");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2277
			soft_req |= NEED_MPI_RESET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2278
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2279
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2280
		case SYS_EVENT_MAC_INTERRUPT:	/* 0x9h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2281
			QL_PRINT(DBG_MBX, ("MAC Interrupt"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2282
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2283
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2284
		case SYS_EVENT_PCI_ERR_READING_SML_LRG_BUF:	/* 0x40h */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2285
			cmn_err(CE_WARN, "PCI Error reading small/large "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2286
			    "buffers occured");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2287
			soft_req |= NEED_HW_RESET;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2288
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2289
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2290
		default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2291
			QL_PRINT(DBG_RX, ("%s(%d) unknown Sys Event: "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2292
			    "type 0x%x occured",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2293
			    __func__, qlge->instance, eventType));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2294
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2295
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2296
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2297
	if ((soft_req & NEED_MPI_RESET) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2298
		ql_wake_mpi_reset_soft_intr(qlge);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2299
		if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2300
			ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2301
			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2302
		}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2303
	} else if ((soft_req & NEED_HW_RESET) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2304
		ql_wake_asic_reset_soft_intr(qlge);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2305
		if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2306
			ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2307
			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2308
		}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2309
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2310
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2311
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2312
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2313
 * set received packet checksum flag
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2314
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2315
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2316
ql_set_rx_cksum(mblk_t *mp, struct ib_mac_iocb_rsp *net_rsp)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2317
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2318
	uint32_t flags;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2319
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2320
	/* Not TCP or UDP packet? nothing more to do */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2321
	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_T) == 0) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2322
	    ((net_rsp->flags2 & IB_MAC_IOCB_RSP_U) == 0))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2323
	return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2324
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2325
	/* No CKO support for IPv6 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2326
	if ((net_rsp->flags3 & IB_MAC_IOCB_RSP_V6) != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2327
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2328
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2329
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2330
	 * If checksum error, don't set flags; stack will calculate
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2331
	 * checksum, detect the error and update statistics
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2332
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2333
	if (((net_rsp->flags1 & IB_MAC_IOCB_RSP_TE) != 0) ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2334
	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_IE) != 0))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2335
		return;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2336
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2337
	/* TCP or UDP packet and checksum valid */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2338
	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_T) != 0) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2339
	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_NU) == 0)) {
11878
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  2340
		flags = HCK_FULLCKSUM_OK;
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  2341
		mac_hcksum_set(mp, 0, 0, 0, 0, flags);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2342
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2343
	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_U) != 0) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2344
	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_NU) == 0)) {
11878
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  2345
		flags = HCK_FULLCKSUM_OK;
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  2346
		mac_hcksum_set(mp, 0, 0, 0, 0, flags);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2347
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2348
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2349
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2350
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2351
 * This function goes through h/w descriptor in one specified rx ring,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2352
 * receives the data if the descriptor status shows the data is ready.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2353
 * It returns a chain of mblks containing the received data, to be
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2354
 * passed up to mac_rx_ring().
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2355
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2356
mblk_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2357
ql_ring_rx(struct rx_ring *rx_ring, int poll_bytes)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2358
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2359
	qlge_t *qlge = rx_ring->qlge;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2360
	uint32_t prod = ql_read_sh_reg(qlge, rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2361
	struct ib_mac_iocb_rsp *net_rsp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2362
	mblk_t *mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2363
	mblk_t *mblk_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2364
	mblk_t **mblk_tail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2365
	uint32_t received_bytes = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2366
	uint32_t length;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2367
#ifdef QLGE_PERFORMANCE
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2368
	uint32_t pkt_ct = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2369
#endif
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2370
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2371
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2372
	uint32_t consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2373
	uint32_t producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2374
	uint32_t num_free_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2375
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2376
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2377
	temp = ql_read_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2378
	consumer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2379
	producer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2380
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2381
	if (consumer_idx > producer_idx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2382
		num_free_entries = (consumer_idx - producer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2383
	else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2384
		num_free_entries = NUM_RX_RING_ENTRIES - (
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2385
		    producer_idx - consumer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2386
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2387
	if (num_free_entries < qlge->cq_low_count[rx_ring->cq_id])
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2388
		qlge->cq_low_count[rx_ring->cq_id] = num_free_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2389
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2390
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2391
	mblk_head = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2392
	mblk_tail = &mblk_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2393
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2394
	while ((prod != rx_ring->cnsmr_idx)) {
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2395
		QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2396
		    ("%s cq_id = %d, prod = %d, cnsmr = %d.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2397
		    __func__, rx_ring->cq_id, prod, rx_ring->cnsmr_idx));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2398
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2399
		net_rsp = (struct ib_mac_iocb_rsp *)rx_ring->curr_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2400
		(void) ddi_dma_sync(rx_ring->cq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2401
		    (off_t)((uintptr_t)net_rsp -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2402
		    (uintptr_t)rx_ring->cq_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2403
		    (size_t)sizeof (*net_rsp), DDI_DMA_SYNC_FORKERNEL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2404
		QL_DUMP(DBG_RX, "qlge_ring_rx: rx completion iocb\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2405
		    rx_ring->curr_entry, 8, (size_t)sizeof (*net_rsp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2406
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2407
		switch (net_rsp->opcode) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2408
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2409
		case OPCODE_IB_MAC_IOCB:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2410
			/* Adding length of pkt header and payload */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2411
			length = le32_to_cpu(net_rsp->data_len) +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2412
			    le32_to_cpu(net_rsp->hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2413
			if ((poll_bytes != QLGE_POLL_ALL) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2414
			    ((received_bytes + length) > poll_bytes)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2415
				continue;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2416
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2417
			received_bytes += length;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2418
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2419
#ifdef QLGE_PERFORMANCE
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2420
			pkt_ct++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2421
#endif
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2422
			mp = ql_build_rx_mp(qlge, rx_ring, net_rsp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2423
			if (mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2424
				if (rx_ring->mac_flags != QL_MAC_STARTED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2425
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2426
					 * Increment number of packets we have
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2427
					 * indicated to the stack, should be
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2428
					 * decremented when we get it back
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2429
					 * or when freemsg is called
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2430
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2431
					ASSERT(rx_ring->rx_indicate
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2432
					    <= rx_ring->cq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2433
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2434
					cmn_err(CE_WARN, "%s do not send to OS,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2435
					    " mac_flags %d, indicate %d",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2436
					    __func__, rx_ring->mac_flags,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2437
					    rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2438
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2439
					QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2440
					    ("cq_id = %d, packet "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2441
					    "dropped, mac not "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2442
					    "enabled.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2443
					    rx_ring->cq_id));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2444
					rx_ring->rx_pkt_dropped_mac_unenabled++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2445
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2446
					/* rx_lock is expected to be held */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2447
					mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2448
					freemsg(mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2449
					mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2450
					mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2451
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2452
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2453
				if (mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2454
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2455
					 * IP full packet has been
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2456
					 * successfully verified by
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2457
					 * H/W and is correct
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2458
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2459
					ql_set_rx_cksum(mp, net_rsp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2460
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2461
					rx_ring->rx_packets++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2462
					rx_ring->rx_bytes += length;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2463
					*mblk_tail = mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2464
					mblk_tail = &mp->b_next;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2465
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2466
			} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2467
				QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2468
				    ("cq_id = %d, packet dropped\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2469
				    rx_ring->cq_id));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2470
				rx_ring->rx_packets_dropped_no_buffer++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2471
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2472
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2473
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2474
		case OPCODE_IB_SYS_EVENT_IOCB:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2475
			ql_process_chip_ae_intr(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2476
			    (struct ib_sys_event_iocb_rsp *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2477
			    net_rsp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2478
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2479
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2480
		default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2481
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2482
			    "%s Ring(%d)Hit default case, not handled!"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2483
			    " dropping the packet, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2484
			    "opcode = %x.", __func__, rx_ring->cq_id,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2485
			    net_rsp->opcode);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2486
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2487
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2488
		/* increment cnsmr_idx and curr_entry */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2489
		ql_update_cq(rx_ring);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2490
		prod = ql_read_sh_reg(qlge, rx_ring);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2491
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2492
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2493
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2494
#ifdef QLGE_PERFORMANCE
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2495
	if (pkt_ct >= 7)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2496
		rx_ring->hist[7]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2497
	else if (pkt_ct == 6)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2498
		rx_ring->hist[6]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2499
	else if (pkt_ct == 5)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2500
		rx_ring->hist[5]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2501
	else if (pkt_ct == 4)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2502
		rx_ring->hist[4]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2503
	else if (pkt_ct == 3)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2504
		rx_ring->hist[3]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2505
	else if (pkt_ct == 2)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2506
		rx_ring->hist[2]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2507
	else if (pkt_ct == 1)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2508
		rx_ring->hist[1]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2509
	else if (pkt_ct == 0)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2510
		rx_ring->hist[0]++;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2511
#endif
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2512
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2513
	/* update cnsmr_idx */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2514
	ql_write_cq_idx(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2515
	/* do not enable interrupt for polling mode */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2516
	if (poll_bytes == QLGE_POLL_ALL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2517
		ql_enable_completion_interrupt(rx_ring->qlge, rx_ring->irq);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2518
	return (mblk_head);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2519
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2520
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2521
/* Process an outbound completion from an rx ring. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2522
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2523
ql_process_mac_tx_intr(qlge_t *qlge, struct ob_mac_iocb_rsp *mac_rsp)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2524
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2525
	struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2526
	struct tx_ring_desc *tx_ring_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2527
	int j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2528
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2529
	tx_ring = &qlge->tx_ring[mac_rsp->txq_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2530
	tx_ring_desc = tx_ring->wq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2531
	tx_ring_desc += mac_rsp->tid;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2532
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2533
	if (tx_ring_desc->tx_type == USE_DMA) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2534
		QL_PRINT(DBG_TX, ("%s(%d): tx type USE_DMA\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2535
		    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2536
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2537
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2538
		 * Release the DMA resource that is used for
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2539
		 * DMA binding.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2540
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2541
		for (j = 0; j < tx_ring_desc->tx_dma_handle_used; j++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2542
			(void) ddi_dma_unbind_handle(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2543
			    tx_ring_desc->tx_dma_handle[j]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2544
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2545
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2546
		tx_ring_desc->tx_dma_handle_used = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2547
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2548
		 * Free the mblk after sending completed
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2549
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2550
		if (tx_ring_desc->mp != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2551
			freemsg(tx_ring_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2552
			tx_ring_desc->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2553
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2554
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2555
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2556
	tx_ring->obytes += tx_ring_desc->tx_bytes;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2557
	tx_ring->opackets++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2558
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2559
	if (mac_rsp->flags1 & (OB_MAC_IOCB_RSP_E | OB_MAC_IOCB_RSP_S |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2560
	    OB_MAC_IOCB_RSP_L | OB_MAC_IOCB_RSP_B)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2561
		tx_ring->errxmt++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2562
		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_E) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2563
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2564
			QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2565
			    ("Total descriptor length did not match "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2566
			    "transfer length.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2567
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2568
		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_S) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2569
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2570
			QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2571
			    ("Frame too short to be legal, not sent.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2572
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2573
		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_L) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2574
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2575
			QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2576
			    ("Frame too long, but sent anyway.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2577
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2578
		if (mac_rsp->flags3 & OB_MAC_IOCB_RSP_B) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2579
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2580
			QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2581
			    ("PCI backplane error. Frame not sent.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2582
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2583
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2584
	atomic_inc_32(&tx_ring->tx_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2585
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2586
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2587
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2588
 * clean up tx completion iocbs
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2589
 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2590
int
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2591
ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2592
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2593
	qlge_t *qlge = rx_ring->qlge;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2594
	uint32_t prod = ql_read_sh_reg(qlge, rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2595
	struct ob_mac_iocb_rsp *net_rsp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2596
	int count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2597
	struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2598
	boolean_t resume_tx = B_FALSE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2599
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2600
	mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2601
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2602
	{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2603
	uint32_t consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2604
	uint32_t producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2605
	uint32_t num_free_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2606
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2607
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2608
	temp = ql_read_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2609
	consumer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2610
	producer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2611
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2612
	if (consumer_idx > producer_idx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2613
		num_free_entries = (consumer_idx - producer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2614
	else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2615
		num_free_entries = NUM_RX_RING_ENTRIES -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2616
		    (producer_idx - consumer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2617
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2618
	if (num_free_entries < qlge->cq_low_count[rx_ring->cq_id])
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2619
		qlge->cq_low_count[rx_ring->cq_id] = num_free_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2620
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2621
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2622
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2623
	/* While there are entries in the completion queue. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2624
	while (prod != rx_ring->cnsmr_idx) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2625
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2626
		QL_PRINT(DBG_RX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2627
		    ("%s cq_id = %d, prod = %d, cnsmr = %d.\n", __func__,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2628
		    rx_ring->cq_id, prod, rx_ring->cnsmr_idx));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2629
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2630
		net_rsp = (struct ob_mac_iocb_rsp *)rx_ring->curr_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2631
		(void) ddi_dma_sync(rx_ring->cq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2632
		    (off_t)((uintptr_t)net_rsp -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2633
		    (uintptr_t)rx_ring->cq_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2634
		    (size_t)sizeof (*net_rsp), DDI_DMA_SYNC_FORKERNEL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2635
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2636
		QL_DUMP(DBG_RX, "ql_clean_outbound_rx_ring: "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2637
		    "response packet data\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2638
		    rx_ring->curr_entry, 8,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2639
		    (size_t)sizeof (*net_rsp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2640
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2641
		switch (net_rsp->opcode) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2642
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2643
		case OPCODE_OB_MAC_OFFLOAD_IOCB:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2644
		case OPCODE_OB_MAC_IOCB:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2645
			ql_process_mac_tx_intr(qlge, net_rsp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2646
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2647
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2648
		default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2649
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2650
			    "%s Hit default case, not handled! "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2651
			    "dropping the packet,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2652
			    " opcode = %x.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2653
			    __func__, net_rsp->opcode);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2654
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2655
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2656
		count++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2657
		ql_update_cq(rx_ring);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2658
		prod = ql_read_sh_reg(qlge, rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2659
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2660
	ql_write_cq_idx(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2661
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2662
	mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2663
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2664
	net_rsp = (struct ob_mac_iocb_rsp *)rx_ring->curr_entry;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2665
	tx_ring = &qlge->tx_ring[net_rsp->txq_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2666
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2667
	mutex_enter(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2668
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2669
	if (tx_ring->queue_stopped &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2670
	    (tx_ring->tx_free_count > TX_RESUME_THRESHOLD)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2671
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2672
		 * The queue got stopped because the tx_ring was full.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2673
		 * Wake it up, because it's now at least 25% empty.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2674
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2675
		tx_ring->queue_stopped = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2676
		resume_tx = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2677
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2678
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2679
	mutex_exit(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2680
	/* Don't hold the lock during OS callback */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2681
	if (resume_tx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2682
		RESUME_TX(tx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2683
	return (count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2684
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2685
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2686
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2687
 * reset asic when error happens
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2688
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2689
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2690
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2691
ql_asic_reset_work(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2692
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2693
	qlge_t *qlge = (qlge_t *)((void *)arg1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2694
	int status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2695
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2696
	mutex_enter(&qlge->gen_mutex);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2697
	(void) ql_do_stop(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2698
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2699
	 * Write default ethernet address to chip register Mac
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2700
	 * Address slot 0 and Enable Primary Mac Function.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2701
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2702
	mutex_enter(&qlge->hw_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2703
	(void) ql_unicst_set(qlge,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2704
	    (uint8_t *)qlge->unicst_addr[0].addr.ether_addr_octet, 0);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2705
	mutex_exit(&qlge->hw_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2706
	qlge->mac_flags = QL_MAC_INIT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2707
	status = ql_do_start(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2708
	if (status != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2709
		goto error;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2710
	qlge->mac_flags = QL_MAC_STARTED;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2711
	mutex_exit(&qlge->gen_mutex);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2712
	ddi_fm_service_impact(qlge->dip, DDI_SERVICE_RESTORED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2713
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2714
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2715
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2716
error:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2717
	mutex_exit(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2718
	cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2719
	    "qlge up/down cycle failed, closing device");
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2720
	if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2721
		ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2722
		ddi_fm_service_impact(qlge->dip, DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2723
		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2724
	}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2725
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2726
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2727
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2728
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2729
 * Reset MPI
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2730
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2731
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2732
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2733
ql_mpi_reset_work(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2734
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2735
	qlge_t *qlge = (qlge_t *)((void *)arg1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2736
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  2737
	(void) ql_reset_mpi_risc(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2738
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2739
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2740
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2741
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2742
 * Process MPI mailbox messages
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2743
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2744
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2745
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2746
ql_mpi_event_work(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2747
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2748
	qlge_t *qlge = (qlge_t *)((void *)arg1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2749
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2750
	ql_do_mpi_intr(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2751
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2752
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2753
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2754
/* Fire up a handler to reset the MPI processor. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2755
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2756
ql_wake_asic_reset_soft_intr(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2757
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2758
	(void) ddi_intr_trigger_softint(qlge->asic_reset_intr_hdl, NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2759
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2760
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2761
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2762
ql_wake_mpi_reset_soft_intr(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2763
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2764
	(void) ddi_intr_trigger_softint(qlge->mpi_reset_intr_hdl, NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2765
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2766
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2767
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2768
ql_wake_mpi_event_soft_intr(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2769
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2770
	(void) ddi_intr_trigger_softint(qlge->mpi_event_intr_hdl, NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2771
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2772
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2773
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2774
 * This handles a fatal error, MPI activity, and the default
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2775
 * rx_ring in an MSI-X multiple interrupt vector environment.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2776
 * In MSI/Legacy environment it also process the rest of
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2777
 * the rx_rings.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2778
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2779
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2780
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2781
ql_isr(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2782
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2783
	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2784
	struct rx_ring *ob_ring;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2785
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2786
	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2787
	uint32_t var, prod;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2788
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2789
	int work_done = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2790
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2791
	mblk_t *mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2792
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2793
	_NOTE(ARGUNUSED(arg2));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2794
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2795
	++qlge->rx_interrupts[rx_ring->cq_id];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2796
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2797
	if (ql_atomic_read_32(&qlge->intr_ctx[0].irq_cnt)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2798
		ql_write_reg(qlge, REG_RSVD7, 0xfeed0002);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2799
		var = ql_read_reg(qlge, REG_ERROR_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2800
		var = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2801
		var = ql_read_reg(qlge, REG_INTERRUPT_STATUS_1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2802
		return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2803
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2804
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2805
	ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2806
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2807
	/*
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2808
	 * process send completes on first stride tx ring if available
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2809
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2810
	if (qlge->isr_stride) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2811
		ob_ring = &qlge->rx_ring[qlge->isr_stride];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2812
		if (ql_read_sh_reg(qlge, ob_ring) !=
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2813
		    ob_ring->cnsmr_idx) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2814
			(void) ql_clean_outbound_rx_ring(ob_ring);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2815
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2816
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2817
	/*
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2818
	 * Check the default queue and wake handler if active.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2819
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2820
	rx_ring = &qlge->rx_ring[0];
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2821
	prod = ql_read_sh_reg(qlge, rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2822
	QL_PRINT(DBG_INTR, ("rx-ring[0] prod index 0x%x, consumer 0x%x ",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2823
	    prod, rx_ring->cnsmr_idx));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2824
	/* check if interrupt is due to incoming packet */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2825
	if (prod != rx_ring->cnsmr_idx) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2826
		QL_PRINT(DBG_INTR, ("Waking handler for rx_ring[0].\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2827
		ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2828
		mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2829
		mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2830
		mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2831
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2832
		if (mp != NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2833
			RX_UPSTREAM(rx_ring, mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2834
		work_done++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2835
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2836
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2837
		 * If interrupt is not due to incoming packet, read status
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2838
		 * register to see if error happens or mailbox interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2839
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2840
		var = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2841
		if ((var & STATUS_FE) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2842
			ql_write_reg(qlge, REG_RSVD7, 0xfeed0003);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2843
			if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2844
				atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2845
				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2846
				ddi_fm_service_impact(qlge->dip,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2847
				    DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2848
			}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2849
			cmn_err(CE_WARN, "Got fatal error, STS = %x.", var);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2850
			var = ql_read_reg(qlge, REG_ERROR_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2851
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2852
			    "Resetting chip. Error Status Register = 0x%x",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2853
			    var);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2854
			ql_wake_asic_reset_soft_intr(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2855
			return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2856
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2857
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2858
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2859
		 * Check MPI processor activity.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2860
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2861
		if ((var & STATUS_PI) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2862
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2863
			 * We've got an async event or mailbox completion.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2864
			 * Handle it and clear the source of the interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2865
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2866
			ql_write_reg(qlge, REG_RSVD7, 0xfeed0004);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2867
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2868
			QL_PRINT(DBG_INTR, ("Got MPI processor interrupt.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2869
			ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2870
			ql_wake_mpi_event_soft_intr(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2871
			work_done++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2872
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2873
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2874
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2875
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2876
	if (qlge->intr_type != DDI_INTR_TYPE_MSIX) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2877
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2878
		 * Start the DPC for each active queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2879
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2880
		for (i = 1; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2881
			rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2882
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2883
			if (ql_read_sh_reg(qlge, rx_ring) !=
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2884
			    rx_ring->cnsmr_idx) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2885
				QL_PRINT(DBG_INTR,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2886
				    ("Waking handler for rx_ring[%d].\n", i));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2887
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2888
				ql_disable_completion_interrupt(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2889
				    rx_ring->irq);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2890
				if (rx_ring->type == TX_Q) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  2891
					(void) ql_clean_outbound_rx_ring(
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  2892
					    rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2893
					ql_enable_completion_interrupt(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2894
					    rx_ring->qlge, rx_ring->irq);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2895
				} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2896
					mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2897
					mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2898
					mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2899
					if (mp != NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2900
						RX_UPSTREAM(rx_ring, mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2901
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2902
					if (rx_ring->mac_flags ==
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2903
					    QL_MAC_STOPPED)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2904
						cmn_err(CE_NOTE,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2905
						    "%s rx_indicate(%d) %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2906
						    __func__, i,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2907
						    rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2908
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2909
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2910
				work_done++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2911
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2912
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2913
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2914
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2915
	ql_enable_completion_interrupt(qlge, intr_ctx->intr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2916
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2917
	return (work_done ? DDI_INTR_CLAIMED : DDI_INTR_UNCLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2918
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2919
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2920
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2921
 * MSI-X Multiple Vector Interrupt Handler for outbound (TX) completions.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2922
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2923
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2924
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2925
ql_msix_tx_isr(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2926
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2927
	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2928
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2929
	_NOTE(ARGUNUSED(arg2));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2930
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2931
	++qlge->rx_interrupts[rx_ring->cq_id];
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  2932
	(void) ql_clean_outbound_rx_ring(rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2933
	ql_enable_completion_interrupt(rx_ring->qlge, rx_ring->irq);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2934
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2935
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2936
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2937
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2938
/*
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2939
 * MSI-X Multiple Vector Interrupt Handler
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2940
 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2941
/* ARGSUSED */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2942
static uint_t
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2943
ql_msix_isr(caddr_t arg1, caddr_t arg2)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2944
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2945
	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2946
	struct rx_ring *ob_ring;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2947
	qlge_t *qlge = rx_ring->qlge;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2948
	mblk_t *mp;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2949
	_NOTE(ARGUNUSED(arg2));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2950
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2951
	QL_PRINT(DBG_INTR, ("%s for ring %d\n", __func__, rx_ring->cq_id));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2952
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2953
	ql_disable_completion_interrupt(qlge, rx_ring->irq);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2954
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2955
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2956
	 * process send completes on stride tx ring if available
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2957
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2958
	if (qlge->isr_stride) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2959
		ob_ring = rx_ring + qlge->isr_stride;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2960
		if (ql_read_sh_reg(qlge, ob_ring) !=
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2961
		    ob_ring->cnsmr_idx) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2962
			++qlge->rx_interrupts[ob_ring->cq_id];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2963
			(void) ql_clean_outbound_rx_ring(ob_ring);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2964
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2965
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2966
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2967
	++qlge->rx_interrupts[rx_ring->cq_id];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2968
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2969
	mutex_enter(&rx_ring->rx_lock);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2970
	mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2971
	mutex_exit(&rx_ring->rx_lock);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2972
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2973
	if (mp != NULL)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2974
		RX_UPSTREAM(rx_ring, mp);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2975
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2976
	return (DDI_INTR_CLAIMED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2977
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2978
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  2979
/*
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2980
 * Poll n_bytes of chained incoming packets
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2981
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2982
mblk_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2983
ql_ring_rx_poll(void *arg, int n_bytes)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2984
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2985
	struct rx_ring *rx_ring = (struct rx_ring *)arg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2986
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2987
	mblk_t *mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2988
	uint32_t var;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2989
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2990
	ASSERT(n_bytes >= 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2991
	QL_PRINT(DBG_GLD, ("%s for ring(%d) to read max %d bytes\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2992
	    __func__, rx_ring->cq_id, n_bytes));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2993
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2994
	++qlge->rx_polls[rx_ring->cq_id];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2995
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2996
	if (n_bytes == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2997
		return (mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2998
	mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  2999
	mp = ql_ring_rx(rx_ring, n_bytes);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3000
	mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3001
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3002
	if ((rx_ring->cq_id == 0) && (mp == NULL)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3003
		var = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3004
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3005
		 * Check for fatal error.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3006
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3007
		if ((var & STATUS_FE) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3008
			ql_write_reg(qlge, REG_RSVD7, 0xfeed0003);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3009
			var = ql_read_reg(qlge, REG_ERROR_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3010
			cmn_err(CE_WARN, "Got fatal error %x.", var);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3011
			ql_wake_asic_reset_soft_intr(qlge);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3012
			if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3013
				atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3014
				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3015
				ddi_fm_service_impact(qlge->dip,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3016
				    DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3017
			}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3018
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3019
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3020
		 * Check MPI processor activity.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3021
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3022
		if ((var & STATUS_PI) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3023
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3024
			 * We've got an async event or mailbox completion.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3025
			 * Handle it and clear the source of the interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3026
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3027
			ql_write_reg(qlge, REG_RSVD7, 0xfeed0004);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3028
			ql_do_mpi_intr(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3029
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3030
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3031
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3032
	return (mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3033
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3034
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3035
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3036
 * MSI-X Multiple Vector Interrupt Handler for inbound (RX) completions.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3037
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3038
/* ARGSUSED */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3039
static uint_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3040
ql_msix_rx_isr(caddr_t arg1, caddr_t arg2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3041
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3042
	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3043
	qlge_t *qlge = rx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3044
	mblk_t *mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3045
	_NOTE(ARGUNUSED(arg2));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3046
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3047
	QL_PRINT(DBG_INTR, ("%s for ring %d\n", __func__, rx_ring->cq_id));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3048
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3049
	++qlge->rx_interrupts[rx_ring->cq_id];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3050
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3051
	mutex_enter(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3052
	mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3053
	mutex_exit(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3054
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3055
	if (mp != NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3056
		RX_UPSTREAM(rx_ring, mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3057
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3058
	return (DDI_INTR_CLAIMED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3059
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3060
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3061
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3062
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3063
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3064
 * Allocate DMA Buffer for ioctl service
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3065
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3066
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3067
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3068
ql_alloc_ioctl_dma_buf(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3069
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3070
	uint64_t phy_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3071
	uint64_t alloc_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3072
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3073
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3074
	alloc_size = qlge->ioctl_buf_dma_attr.mem_len =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3075
	    max(WCS_MPI_CODE_RAM_LENGTH, MEMC_MPI_RAM_LENGTH);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3076
	if (ql_alloc_phys(qlge->dip, &qlge->ioctl_buf_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3077
	    &ql_buf_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3078
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3079
	    &qlge->ioctl_buf_dma_attr.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3080
	    (size_t)alloc_size,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3081
	    (size_t)0,  /* alignment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3082
	    (caddr_t *)&qlge->ioctl_buf_dma_attr.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3083
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3084
		cmn_err(CE_WARN, "%s(%d): ioctl DMA allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3085
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3086
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3087
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3088
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3089
	phy_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3090
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3091
	if (qlge->ioctl_buf_dma_attr.vaddr == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3092
		cmn_err(CE_WARN, "%s(%d): failed.", __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3093
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3094
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3095
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3096
	qlge->ioctl_buf_dma_attr.dma_addr = phy_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3097
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3098
	QL_PRINT(DBG_MBX, ("%s: ioctl_dma_buf_virt_addr = 0x%lx, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3099
	    "phy_addr = 0x%lx\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3100
	    __func__, qlge->ioctl_buf_dma_attr.vaddr, phy_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3101
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3102
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3103
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3104
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3105
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3106
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3107
 * Function to free physical memory.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3108
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3109
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3110
ql_free_phys(ddi_dma_handle_t *dma_handle, ddi_acc_handle_t *acc_handle)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3111
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3112
	if (dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3113
		(void) ddi_dma_unbind_handle(*dma_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3114
		if (acc_handle != NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3115
			ddi_dma_mem_free(acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3116
		ddi_dma_free_handle(dma_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3117
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3118
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3119
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3120
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3121
 * Function to free ioctl dma buffer.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3122
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3123
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3124
ql_free_ioctl_dma_buf(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3125
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3126
	if (qlge->ioctl_buf_dma_attr.dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3127
		ql_free_phys(&qlge->ioctl_buf_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3128
		    &qlge->ioctl_buf_dma_attr.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3129
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3130
		qlge->ioctl_buf_dma_attr.vaddr = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3131
		qlge->ioctl_buf_dma_attr.dma_handle = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3132
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3133
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3134
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3135
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3136
 * Free shadow register space used for request and completion queues
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3137
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3138
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3139
ql_free_shadow_space(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3140
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3141
	if (qlge->host_copy_shadow_dma_attr.dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3142
		ql_free_phys(&qlge->host_copy_shadow_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3143
		    &qlge->host_copy_shadow_dma_attr.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3144
		bzero(&qlge->host_copy_shadow_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3145
		    sizeof (qlge->host_copy_shadow_dma_attr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3146
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3147
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3148
	if (qlge->buf_q_ptr_base_addr_dma_attr.dma_handle != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3149
		ql_free_phys(&qlge->buf_q_ptr_base_addr_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3150
		    &qlge->buf_q_ptr_base_addr_dma_attr.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3151
		bzero(&qlge->buf_q_ptr_base_addr_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3152
		    sizeof (qlge->buf_q_ptr_base_addr_dma_attr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3153
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3154
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3155
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3156
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3157
 * Allocate shadow register space for request and completion queues
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3158
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3159
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3160
ql_alloc_shadow_space(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3161
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3162
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3163
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3164
	if (ql_alloc_phys(qlge->dip,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3165
	    &qlge->host_copy_shadow_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3166
	    &ql_dev_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3167
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3168
	    &qlge->host_copy_shadow_dma_attr.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3169
	    (size_t)VM_PAGE_SIZE,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3170
	    (size_t)4, /* 4 bytes alignment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3171
	    (caddr_t *)&qlge->host_copy_shadow_dma_attr.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3172
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3173
		bzero(&qlge->host_copy_shadow_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3174
		    sizeof (qlge->host_copy_shadow_dma_attr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3175
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3176
		cmn_err(CE_WARN, "%s(%d): Unable to allocate DMA memory for "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3177
		    "response shadow registers", __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3178
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3179
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3180
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3181
	qlge->host_copy_shadow_dma_attr.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3182
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3183
	if (ql_alloc_phys(qlge->dip,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3184
	    &qlge->buf_q_ptr_base_addr_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3185
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3186
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3187
	    &qlge->buf_q_ptr_base_addr_dma_attr.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3188
	    (size_t)VM_PAGE_SIZE,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3189
	    (size_t)4, /* 4 bytes alignment */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3190
	    (caddr_t *)&qlge->buf_q_ptr_base_addr_dma_attr.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3191
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3192
		bzero(&qlge->buf_q_ptr_base_addr_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3193
		    sizeof (qlge->buf_q_ptr_base_addr_dma_attr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3194
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3195
		cmn_err(CE_WARN, "%s(%d): Unable to allocate DMA memory "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3196
		    "for request shadow registers",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3197
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3198
		goto err_wqp_sh_area;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3199
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3200
	qlge->buf_q_ptr_base_addr_dma_attr.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3201
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3202
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3203
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3204
err_wqp_sh_area:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3205
	ql_free_phys(&qlge->host_copy_shadow_dma_attr.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3206
	    &qlge->host_copy_shadow_dma_attr.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3207
	bzero(&qlge->host_copy_shadow_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3208
	    sizeof (qlge->host_copy_shadow_dma_attr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3209
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3210
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3211
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3212
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3213
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3214
 * Initialize a tx ring
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3215
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3216
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3217
ql_init_tx_ring(struct tx_ring *tx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3218
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3219
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3220
	struct ob_mac_iocb_req *mac_iocb_ptr = tx_ring->wq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3221
	struct tx_ring_desc *tx_ring_desc = tx_ring->wq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3222
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3223
	for (i = 0; i < tx_ring->wq_len; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3224
		tx_ring_desc->index = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3225
		tx_ring_desc->queue_entry = mac_iocb_ptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3226
		mac_iocb_ptr++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3227
		tx_ring_desc++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3228
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3229
	tx_ring->tx_free_count = tx_ring->wq_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3230
	tx_ring->queue_stopped = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3231
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3232
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3233
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3234
 * Free one tx ring resources
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3235
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3236
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3237
ql_free_tx_resources(struct tx_ring *tx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3238
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3239
	struct tx_ring_desc *tx_ring_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3240
	int i, j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3241
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3242
	ql_free_phys(&tx_ring->wq_dma.dma_handle, &tx_ring->wq_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3243
	bzero(&tx_ring->wq_dma, sizeof (tx_ring->wq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3244
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3245
	if (tx_ring->wq_desc != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3246
		tx_ring_desc = tx_ring->wq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3247
		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3248
			for (j = 0; j < QL_MAX_TX_DMA_HANDLES; j++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3249
				if (tx_ring_desc->tx_dma_handle[j]) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3250
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3251
					 * The unbinding will happen in tx
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3252
					 * completion, here we just free the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3253
					 * handles
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3254
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3255
					ddi_dma_free_handle(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3256
					    &(tx_ring_desc->tx_dma_handle[j]));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3257
					tx_ring_desc->tx_dma_handle[j] = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3258
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3259
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3260
			if (tx_ring_desc->oal != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3261
				tx_ring_desc->oal_dma_addr = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3262
				tx_ring_desc->oal = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3263
				tx_ring_desc->copy_buffer = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3264
				tx_ring_desc->copy_buffer_dma_addr = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3265
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3266
				ql_free_phys(&tx_ring_desc->oal_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3267
				    &tx_ring_desc->oal_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3268
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3269
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3270
		kmem_free(tx_ring->wq_desc,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3271
		    tx_ring->wq_len * sizeof (struct tx_ring_desc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3272
		tx_ring->wq_desc = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3273
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3274
	/* free the wqicb struct */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3275
	if (tx_ring->wqicb_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3276
		ql_free_phys(&tx_ring->wqicb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3277
		    &tx_ring->wqicb_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3278
		bzero(&tx_ring->wqicb_dma, sizeof (tx_ring->wqicb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3279
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3280
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3281
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3282
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3283
 * Allocate work (request) queue memory and transmit
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3284
 * descriptors for this transmit ring
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3285
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3286
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3287
ql_alloc_tx_resources(qlge_t *qlge, struct tx_ring *tx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3288
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3289
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3290
	struct tx_ring_desc *tx_ring_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3291
	int i, j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3292
	uint32_t length;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3293
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3294
	/* allocate dma buffers for obiocbs */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3295
	if (ql_alloc_phys(qlge->dip, &tx_ring->wq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3296
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3297
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3298
	    &tx_ring->wq_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3299
	    (size_t)tx_ring->wq_size,	/* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3300
	    (size_t)128, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3301
	    (caddr_t *)&tx_ring->wq_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3302
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3303
		bzero(&tx_ring->wq_dma, sizeof (&tx_ring->wq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3304
		cmn_err(CE_WARN, "%s(%d): reqQ allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3305
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3306
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3307
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3308
	tx_ring->wq_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3309
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3310
	tx_ring->wq_desc =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3311
	    kmem_zalloc(tx_ring->wq_len * sizeof (struct tx_ring_desc),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3312
	    KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3313
	if (tx_ring->wq_desc == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3314
		goto err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3315
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3316
		tx_ring_desc = tx_ring->wq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3317
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3318
		 * Allocate a large enough structure to hold the following
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3319
		 * 1. oal buffer MAX_SGELEMENTS * sizeof (oal_entry) bytes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3320
		 * 2. copy buffer of QL_MAX_COPY_LENGTH bytes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3321
		 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3322
		length = (sizeof (struct oal_entry) * MAX_SG_ELEMENTS)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3323
		    + QL_MAX_COPY_LENGTH;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3324
		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3325
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3326
			if (ql_alloc_phys(qlge->dip,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3327
			    &tx_ring_desc->oal_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3328
			    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3329
			    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3330
			    &tx_ring_desc->oal_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3331
			    (size_t)length,	/* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3332
			    (size_t)0, /* default alignment:8 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3333
			    (caddr_t *)&tx_ring_desc->oal_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3334
			    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3335
				bzero(&tx_ring_desc->oal_dma,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3336
				    sizeof (tx_ring_desc->oal_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3337
				cmn_err(CE_WARN, "%s(%d): reqQ tx buf &"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3338
				    "oal alloc failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3339
				    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3340
				return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3341
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3342
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3343
			tx_ring_desc->oal = tx_ring_desc->oal_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3344
			tx_ring_desc->oal_dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3345
			tx_ring_desc->copy_buffer =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3346
			    (caddr_t)((uint8_t *)tx_ring_desc->oal
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3347
			    + (sizeof (struct oal_entry) * MAX_SG_ELEMENTS));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3348
			tx_ring_desc->copy_buffer_dma_addr =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3349
			    (tx_ring_desc->oal_dma_addr
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3350
			    + (sizeof (struct oal_entry) * MAX_SG_ELEMENTS));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3351
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3352
			/* Allocate dma handles for transmit buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3353
			for (j = 0; j < QL_MAX_TX_DMA_HANDLES; j++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3354
				if (ddi_dma_alloc_handle(qlge->dip,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3355
				    &tx_mapping_dma_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3356
				    DDI_DMA_DONTWAIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3357
				    0, &tx_ring_desc->tx_dma_handle[j])
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3358
				    != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3359
					cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3360
					    "!%s: ddi_dma_alloc_handle: "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3361
					    "tx_dma_handle "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3362
					    "alloc failed", __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3363
					goto err;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3364
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3365
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3366
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3367
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3368
	/* alloc a wqicb control block to load this tx ring to hw */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3369
	if (ql_alloc_phys(qlge->dip, &tx_ring->wqicb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3370
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3371
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3372
	    &tx_ring->wqicb_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3373
	    (size_t)sizeof (struct wqicb_t),	/* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3374
	    (size_t)0, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3375
	    (caddr_t *)&tx_ring->wqicb_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3376
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3377
		bzero(&tx_ring->wqicb_dma, sizeof (tx_ring->wqicb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3378
		cmn_err(CE_WARN, "%s(%d): wqicb allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3379
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3380
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3381
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3382
	tx_ring->wqicb_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3383
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3384
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3385
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3386
err:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3387
	ql_free_tx_resources(tx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3388
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3389
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3390
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3391
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3392
 * Free one rx ring resources
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3393
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3394
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3395
ql_free_rx_resources(struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3396
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3397
	/* Free the small buffer queue. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3398
	if (rx_ring->sbq_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3399
		ql_free_phys(&rx_ring->sbq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3400
		    &rx_ring->sbq_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3401
		bzero(&rx_ring->sbq_dma, sizeof (rx_ring->sbq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3402
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3403
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3404
	/* Free the small buffer queue control blocks. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3405
	kmem_free(rx_ring->sbq_desc, rx_ring->sbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3406
	    sizeof (struct bq_desc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3407
	rx_ring->sbq_desc = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3408
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3409
	/* Free the large buffer queue. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3410
	if (rx_ring->lbq_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3411
		ql_free_phys(&rx_ring->lbq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3412
		    &rx_ring->lbq_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3413
		bzero(&rx_ring->lbq_dma, sizeof (rx_ring->lbq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3414
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3415
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3416
	/* Free the large buffer queue control blocks. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3417
	kmem_free(rx_ring->lbq_desc, rx_ring->lbq_len *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3418
	    sizeof (struct bq_desc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3419
	rx_ring->lbq_desc = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3420
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3421
	/* Free cqicb struct */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3422
	if (rx_ring->cqicb_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3423
		ql_free_phys(&rx_ring->cqicb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3424
		    &rx_ring->cqicb_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3425
		bzero(&rx_ring->cqicb_dma, sizeof (rx_ring->cqicb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3426
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3427
	/* Free the rx queue. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3428
	if (rx_ring->cq_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3429
		ql_free_phys(&rx_ring->cq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3430
		    &rx_ring->cq_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3431
		bzero(&rx_ring->cq_dma, sizeof (rx_ring->cq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3432
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3433
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3434
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3435
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3436
 * Allocate queues and buffers for this completions queue based
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3437
 * on the values in the parameter structure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3438
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3439
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3440
ql_alloc_rx_resources(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3441
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3442
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3443
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3444
	if (ql_alloc_phys(qlge->dip, &rx_ring->cq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3445
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3446
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3447
	    &rx_ring->cq_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3448
	    (size_t)rx_ring->cq_size,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3449
	    (size_t)128, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3450
	    (caddr_t *)&rx_ring->cq_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3451
	    &dma_cookie) != 0)	{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3452
		bzero(&rx_ring->cq_dma, sizeof (rx_ring->cq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3453
		cmn_err(CE_WARN, "%s(%d): rspQ allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3454
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3455
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3456
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3457
	rx_ring->cq_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3458
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3459
	if (rx_ring->sbq_len != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3460
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3461
		 * Allocate small buffer queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3462
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3463
		if (ql_alloc_phys(qlge->dip, &rx_ring->sbq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3464
		    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3465
		    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3466
		    &rx_ring->sbq_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3467
		    (size_t)rx_ring->sbq_size,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3468
		    (size_t)128, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3469
		    (caddr_t *)&rx_ring->sbq_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3470
		    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3471
			bzero(&rx_ring->sbq_dma, sizeof (rx_ring->sbq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3472
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3473
			    "%s(%d): small buffer queue allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3474
			    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3475
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3476
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3477
		rx_ring->sbq_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3478
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3479
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3480
		 * Allocate small buffer queue control blocks.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3481
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3482
		rx_ring->sbq_desc =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3483
		    kmem_zalloc(rx_ring->sbq_len * sizeof (struct bq_desc),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3484
		    KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3485
		if (rx_ring->sbq_desc == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3486
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3487
			    "sbq control block allocation failed.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3488
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3489
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3490
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3491
		ql_init_sbq_ring(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3492
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3493
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3494
	if (rx_ring->lbq_len != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3495
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3496
		 * Allocate large buffer queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3497
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3498
		if (ql_alloc_phys(qlge->dip, &rx_ring->lbq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3499
		    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3500
		    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3501
		    &rx_ring->lbq_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3502
		    (size_t)rx_ring->lbq_size,  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3503
		    (size_t)128, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3504
		    (caddr_t *)&rx_ring->lbq_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3505
		    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3506
			bzero(&rx_ring->lbq_dma, sizeof (rx_ring->lbq_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3507
			cmn_err(CE_WARN, "%s(%d): lbq allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3508
			    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3509
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3510
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3511
		rx_ring->lbq_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3512
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3513
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3514
		 * Allocate large buffer queue control blocks.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3515
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3516
		rx_ring->lbq_desc =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3517
		    kmem_zalloc(rx_ring->lbq_len * sizeof (struct bq_desc),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3518
		    KM_NOSLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3519
		if (rx_ring->lbq_desc == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3520
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3521
			    "Large buffer queue control block allocation "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3522
			    "failed.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3523
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3524
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3525
		ql_init_lbq_ring(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3526
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3527
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3528
	if (ql_alloc_phys(qlge->dip, &rx_ring->cqicb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3529
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3530
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3531
	    &rx_ring->cqicb_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3532
	    (size_t)sizeof (struct cqicb_t),  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3533
	    (size_t)0, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3534
	    (caddr_t *)&rx_ring->cqicb_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3535
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3536
		bzero(&rx_ring->cqicb_dma, sizeof (rx_ring->cqicb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3537
		cmn_err(CE_WARN, "%s(%d): cqicb allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3538
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3539
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3540
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3541
	rx_ring->cqicb_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3542
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3543
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3544
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3545
err_mem:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3546
	ql_free_rx_resources(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3547
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3548
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3549
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3550
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3551
 * Frees tx/rx queues memory resources
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3552
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3553
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3554
ql_free_mem_resources(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3555
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3556
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3557
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3558
	if (qlge->ricb_dma.dma_handle) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3559
		/* free the ricb struct */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3560
		ql_free_phys(&qlge->ricb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3561
		    &qlge->ricb_dma.acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3562
		bzero(&qlge->ricb_dma, sizeof (qlge->ricb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3563
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3564
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3565
	ql_free_rx_buffers(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3566
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3567
	ql_free_ioctl_dma_buf(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3568
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3569
	for (i = 0; i < qlge->tx_ring_count; i++)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3570
		ql_free_tx_resources(&qlge->tx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3571
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3572
	for (i = 0; i < qlge->rx_ring_count; i++)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3573
		ql_free_rx_resources(&qlge->rx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3574
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3575
	ql_free_shadow_space(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3576
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3577
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3578
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3579
 * Allocate buffer queues, large buffers and small buffers etc
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3580
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3581
 * This API is called in the gld_attach member function. It is called
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3582
 * only once.  Later reset,reboot should not re-allocate all rings and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3583
 * buffers.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3584
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3585
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3586
ql_alloc_mem_resources(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3587
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3588
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3589
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3590
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3591
	/* Allocate space for our shadow registers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3592
	if (ql_alloc_shadow_space(qlge))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3593
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3594
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3595
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3596
		if (ql_alloc_rx_resources(qlge, &qlge->rx_ring[i]) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3597
			cmn_err(CE_WARN, "RX resource allocation failed.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3598
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3599
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3600
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3601
	/* Allocate tx queue resources */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3602
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3603
		if (ql_alloc_tx_resources(qlge, &qlge->tx_ring[i]) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3604
			cmn_err(CE_WARN, "Tx resource allocation failed.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3605
			goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3606
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3607
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3608
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3609
	if (ql_alloc_ioctl_dma_buf(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3610
		goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3611
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3612
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3613
	if (ql_alloc_rx_buffers(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3614
		cmn_err(CE_WARN, "?%s(%d): ql_alloc_rx_buffers failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3615
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3616
		goto err_mem;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3617
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3618
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3619
	qlge->sequence |= INIT_ALLOC_RX_BUF;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3620
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3621
	if (ql_alloc_phys(qlge->dip, &qlge->ricb_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3622
	    &ql_desc_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3623
	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3624
	    &qlge->ricb_dma.acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3625
	    (size_t)sizeof (struct ricb),  /* mem size */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3626
	    (size_t)0, /* alignment:128 bytes boundary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3627
	    (caddr_t *)&qlge->ricb_dma.vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3628
	    &dma_cookie) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3629
		bzero(&qlge->ricb_dma, sizeof (qlge->ricb_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3630
		cmn_err(CE_WARN, "%s(%d): ricb allocation failed.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3631
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3632
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3633
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3634
	qlge->ricb_dma.dma_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3635
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3636
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3637
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3638
err_mem:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3639
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3640
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3641
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3642
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3643
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3644
 * Function used to allocate physical memory and zero it.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3645
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3646
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3647
static int
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3648
ql_alloc_phys_rbuf(dev_info_t *dip, ddi_dma_handle_t *dma_handle,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3649
    ddi_device_acc_attr_t *device_acc_attr,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3650
    uint_t dma_flags,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3651
    ddi_acc_handle_t *acc_handle,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3652
    size_t size,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3653
    size_t alignment,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3654
    caddr_t *vaddr,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3655
    ddi_dma_cookie_t *dma_cookie)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3656
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3657
	size_t rlen;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3658
	uint_t cnt;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3659
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3660
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3661
	 * Workaround for SUN XMITS buffer must end and start on 8 byte
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3662
	 * boundary. Else, hardware will overrun the buffer. Simple fix is
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3663
	 * to make sure buffer has enough room for overrun.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3664
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3665
	if (size & 7) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3666
		size += 8 - (size & 7);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3667
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3668
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3669
	/* Adjust the alignment if requested */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3670
	if (alignment) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3671
		dma_attr.dma_attr_align = alignment;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3672
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3673
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3674
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3675
	 * Allocate DMA handle
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3676
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3677
	if (ddi_dma_alloc_handle(dip, &dma_attr_rbuf, DDI_DMA_DONTWAIT, NULL,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3678
	    dma_handle) != DDI_SUCCESS) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3679
		cmn_err(CE_WARN, QL_BANG "%s:  ddi_dma_alloc_handle FAILED",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3680
		    __func__);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3681
		return (QL_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3682
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3683
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3684
	 * Allocate DMA memory
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3685
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3686
	if (ddi_dma_mem_alloc(*dma_handle, size, device_acc_attr,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3687
	    dma_flags & (DDI_DMA_CONSISTENT|DDI_DMA_STREAMING),
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3688
	    DDI_DMA_DONTWAIT,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3689
	    NULL, vaddr, &rlen, acc_handle) != DDI_SUCCESS) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3690
		cmn_err(CE_WARN, "alloc_phys: DMA Memory alloc Failed");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3691
		ddi_dma_free_handle(dma_handle);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3692
		return (QL_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3693
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3694
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3695
	if (ddi_dma_addr_bind_handle(*dma_handle, NULL, *vaddr, rlen,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3696
	    dma_flags, DDI_DMA_DONTWAIT, NULL,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3697
	    dma_cookie, &cnt) != DDI_DMA_MAPPED) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3698
		ddi_dma_mem_free(acc_handle);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3699
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3700
		ddi_dma_free_handle(dma_handle);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3701
		cmn_err(CE_WARN, "%s ddi_dma_addr_bind_handle FAILED",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3702
		    __func__);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3703
		return (QL_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3704
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3705
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3706
	if (cnt != 1) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3707
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3708
		ql_free_phys(dma_handle, acc_handle);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3709
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3710
		cmn_err(CE_WARN, "%s: cnt != 1; Failed segment count",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3711
		    __func__);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3712
		return (QL_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3713
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3714
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3715
	bzero((caddr_t)*vaddr, rlen);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3716
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3717
	return (0);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3718
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3719
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3720
/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3721
 * Function used to allocate physical memory and zero it.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3722
 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3723
static int
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3724
ql_alloc_phys(dev_info_t *dip, ddi_dma_handle_t *dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3725
    ddi_device_acc_attr_t *device_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3726
    uint_t dma_flags,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3727
    ddi_acc_handle_t *acc_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3728
    size_t size,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3729
    size_t alignment,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3730
    caddr_t *vaddr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3731
    ddi_dma_cookie_t *dma_cookie)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3732
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3733
	size_t rlen;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3734
	uint_t cnt;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3735
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3736
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3737
	 * Workaround for SUN XMITS buffer must end and start on 8 byte
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3738
	 * boundary. Else, hardware will overrun the buffer. Simple fix is
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3739
	 * to make sure buffer has enough room for overrun.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3740
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3741
	if (size & 7) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3742
		size += 8 - (size & 7);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3743
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3744
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3745
	/* Adjust the alignment if requested */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3746
	if (alignment) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3747
		dma_attr.dma_attr_align = alignment;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3748
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3749
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3750
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3751
	 * Allocate DMA handle
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3752
	 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3753
	if (ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_DONTWAIT, NULL,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3754
	    dma_handle) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3755
		cmn_err(CE_WARN, QL_BANG "%s:  ddi_dma_alloc_handle FAILED",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3756
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3757
		return (QL_ERROR);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3758
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3759
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3760
	 * Allocate DMA memory
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3761
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3762
	if (ddi_dma_mem_alloc(*dma_handle, size, device_acc_attr,
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3763
	    dma_flags & (DDI_DMA_CONSISTENT|DDI_DMA_STREAMING),
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3764
	    DDI_DMA_DONTWAIT,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3765
	    NULL, vaddr, &rlen, acc_handle) != DDI_SUCCESS) {
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3766
		cmn_err(CE_WARN, "alloc_phys: DMA Memory alloc Failed");
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3767
		ddi_dma_free_handle(dma_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3768
		return (QL_ERROR);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3769
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3770
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3771
	if (ddi_dma_addr_bind_handle(*dma_handle, NULL, *vaddr, rlen,
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3772
	    dma_flags, DDI_DMA_DONTWAIT, NULL,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3773
	    dma_cookie, &cnt) != DDI_DMA_MAPPED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3774
		ddi_dma_mem_free(acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3775
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3776
		ddi_dma_free_handle(dma_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3777
		cmn_err(CE_WARN, "%s ddi_dma_addr_bind_handle FAILED",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3778
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3779
		return (QL_ERROR);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3780
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3781
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3782
	if (cnt != 1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3783
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3784
		ql_free_phys(dma_handle, acc_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3785
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3786
		cmn_err(CE_WARN, "%s: cnt != 1; Failed segment count",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3787
		    __func__);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3788
		return (QL_ERROR);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3789
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3790
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3791
	bzero((caddr_t)*vaddr, rlen);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3792
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3793
	return (0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3794
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3795
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3796
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3797
 * Add interrupt handlers based on the interrupt type.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3798
 * Before adding the interrupt handlers, the interrupt vectors should
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3799
 * have been allocated, and the rx/tx rings have also been allocated.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3800
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3801
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3802
ql_add_intr_handlers(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3803
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3804
	int vector = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3805
	int rc, i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3806
	uint32_t value;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3807
	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3808
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3809
	switch (qlge->intr_type) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3810
	case DDI_INTR_TYPE_MSIX:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3811
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3812
		 * Add interrupt handler for rx and tx rings: vector[0 -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3813
		 * (qlge->intr_cnt -1)].
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3814
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3815
		value = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3816
		for (vector = 0; vector < qlge->intr_cnt; vector++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3817
			ql_atomic_set_32(&intr_ctx->irq_cnt, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3818
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3819
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3820
			 * associate interrupt vector with interrupt handler
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3821
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3822
			rc = ddi_intr_add_handler(qlge->htable[vector],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3823
			    (ddi_intr_handler_t *)intr_ctx->handler,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3824
			    (void *)&qlge->rx_ring[vector], NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3825
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3826
			QL_PRINT(DBG_INIT, ("rx_ring[%d] 0x%p\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3827
			    vector, &qlge->rx_ring[vector]));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3828
			if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3829
				QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3830
				    ("Add rx interrupt handler failed. "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3831
				    "return: %d, vector: %d", rc, vector));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3832
				for (vector--; vector >= 0; vector--) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3833
					(void) ddi_intr_remove_handler(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3834
					    qlge->htable[vector]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3835
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3836
				return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3837
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3838
			intr_ctx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3839
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3840
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3841
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3842
	case DDI_INTR_TYPE_MSI:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3843
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3844
		 * Add interrupt handlers for the only vector
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3845
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3846
		ql_atomic_set_32(&intr_ctx->irq_cnt, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3847
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3848
		rc = ddi_intr_add_handler(qlge->htable[vector],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3849
		    ql_isr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3850
		    (caddr_t)&qlge->rx_ring[0], NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3851
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3852
		if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3853
			QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3854
			    ("Add MSI interrupt handler failed: %d\n", rc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3855
			return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3856
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3857
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3858
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3859
	case DDI_INTR_TYPE_FIXED:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3860
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3861
		 * Add interrupt handlers for the only vector
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3862
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3863
		ql_atomic_set_32(&intr_ctx->irq_cnt, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3864
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3865
		rc = ddi_intr_add_handler(qlge->htable[vector],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3866
		    ql_isr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3867
		    (caddr_t)&qlge->rx_ring[0], NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3868
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3869
		if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3870
			QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3871
			    ("Add legacy interrupt handler failed: %d\n", rc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3872
			return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3873
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3874
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3875
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3876
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3877
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3878
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3879
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3880
	/* Enable interrupts */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3881
	/* Block enable */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3882
	if (qlge->intr_cap & DDI_INTR_FLAG_BLOCK) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3883
		QL_PRINT(DBG_INIT, ("Block enabling %d interrupt(s)\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3884
		    qlge->intr_cnt));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3885
		(void) ddi_intr_block_enable(qlge->htable, qlge->intr_cnt);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3886
	} else { /* Non block enable */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3887
		for (i = 0; i < qlge->intr_cnt; i++) {
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3888
			QL_PRINT(DBG_INIT, ("Non Block Enabling interrupt %d "
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3889
			    "handle 0x%x\n", i, qlge->htable[i]));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3890
			(void) ddi_intr_enable(qlge->htable[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3891
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3892
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3893
	qlge->sequence |= INIT_INTR_ENABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3894
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3895
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3896
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3897
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3898
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3899
 * Here we build the intr_ctx structures based on
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3900
 * our rx_ring count and intr vector count.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3901
 * The intr_ctx structure is used to hook each vector
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3902
 * to possibly different handlers.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3903
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3904
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3905
ql_resolve_queues_to_irqs(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3906
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3907
	int i = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3908
	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3909
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3910
	if (qlge->intr_type == DDI_INTR_TYPE_MSIX) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3911
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3912
		 * Each rx_ring has its own intr_ctx since we
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3913
		 * have separate vectors for each queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3914
		 * This only true when MSI-X is enabled.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3915
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3916
		for (i = 0; i < qlge->intr_cnt; i++, intr_ctx++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3917
			qlge->rx_ring[i].irq = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3918
			intr_ctx->intr = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3919
			intr_ctx->qlge = qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3920
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3921
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3922
			 * We set up each vectors enable/disable/read bits so
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3923
			 * there's no bit/mask calculations in critical path.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3924
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3925
			intr_ctx->intr_en_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3926
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3927
			    INTR_EN_TYPE_ENABLE | INTR_EN_IHD_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3928
			    INTR_EN_IHD | i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3929
			intr_ctx->intr_dis_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3930
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3931
			    INTR_EN_TYPE_DISABLE | INTR_EN_IHD_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3932
			    INTR_EN_IHD | i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3933
			intr_ctx->intr_read_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3934
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3935
			    INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3936
			    | i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3937
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3938
			if (i == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3939
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3940
				 * Default queue handles bcast/mcast plus
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3941
				 * async events.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3942
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3943
				intr_ctx->handler = ql_isr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3944
			} else if (qlge->rx_ring[i].type == TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3945
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3946
				 * Outbound queue is for outbound completions
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3947
				 * only.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3948
				 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3949
				if (qlge->isr_stride)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3950
					intr_ctx->handler = ql_msix_isr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3951
				else
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3952
					intr_ctx->handler = ql_msix_tx_isr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3953
			} else {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3954
				/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3955
				 * Inbound queues handle unicast frames only.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3956
				 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3957
				if (qlge->isr_stride)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3958
					intr_ctx->handler = ql_msix_isr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3959
				else
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3960
					intr_ctx->handler = ql_msix_rx_isr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3961
			}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3962
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3963
		i = qlge->intr_cnt;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3964
		for (; i < qlge->rx_ring_count; i++, intr_ctx++) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3965
			int iv = i - qlge->isr_stride;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3966
			qlge->rx_ring[i].irq = iv;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3967
			intr_ctx->intr = iv;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3968
			intr_ctx->qlge = qlge;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3969
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3970
			/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3971
			 * We set up each vectors enable/disable/read bits so
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3972
			 * there's no bit/mask calculations in critical path.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3973
			 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3974
			intr_ctx->intr_en_mask =
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3975
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3976
			    INTR_EN_TYPE_ENABLE | INTR_EN_IHD_MASK |
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3977
			    INTR_EN_IHD | iv;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3978
			intr_ctx->intr_dis_mask =
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3979
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3980
			    INTR_EN_TYPE_DISABLE | INTR_EN_IHD_MASK |
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3981
			    INTR_EN_IHD | iv;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3982
			intr_ctx->intr_read_mask =
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3983
			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3984
			    INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3985
			    | iv;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3986
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3987
			if (qlge->rx_ring[i].type == TX_Q) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3988
				/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3989
				 * Outbound queue is for outbound completions
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3990
				 * only.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3991
				 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  3992
				intr_ctx->handler = ql_msix_isr;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3993
			} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3994
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3995
				 * Inbound queues handle unicast frames only.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3996
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3997
				intr_ctx->handler = ql_msix_rx_isr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3998
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  3999
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4000
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4001
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4002
		 * All rx_rings use the same intr_ctx since
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4003
		 * there is only one vector.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4004
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4005
		intr_ctx->intr = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4006
		intr_ctx->qlge = qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4007
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4008
		 * We set up each vectors enable/disable/read bits so
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4009
		 * there's no bit/mask calculations in the critical path.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4010
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4011
		intr_ctx->intr_en_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4012
		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4013
		    INTR_EN_TYPE_ENABLE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4014
		intr_ctx->intr_dis_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4015
		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4016
		    INTR_EN_TYPE_DISABLE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4017
		intr_ctx->intr_read_mask =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4018
		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4019
		    INTR_EN_TYPE_READ;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4020
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4021
		 * Single interrupt means one handler for all rings.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4022
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4023
		intr_ctx->handler = ql_isr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4024
		for (i = 0; i < qlge->rx_ring_count; i++)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4025
			qlge->rx_ring[i].irq = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4026
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4027
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4028
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4029
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4030
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4031
 * Free allocated interrupts.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4032
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4033
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4034
ql_free_irq_vectors(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4035
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4036
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4037
	int rc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4038
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4039
	if (qlge->sequence & INIT_INTR_ENABLED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4040
		/* Disable all interrupts */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4041
		if (qlge->intr_cap & DDI_INTR_FLAG_BLOCK) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4042
			/* Call ddi_intr_block_disable() */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4043
			(void) ddi_intr_block_disable(qlge->htable,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4044
			    qlge->intr_cnt);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4045
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4046
			for (i = 0; i < qlge->intr_cnt; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4047
				(void) ddi_intr_disable(qlge->htable[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4048
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4049
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4050
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4051
		qlge->sequence &= ~INIT_INTR_ENABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4052
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4053
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4054
	for (i = 0; i < qlge->intr_cnt; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4055
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4056
		if (qlge->sequence & INIT_ADD_INTERRUPT)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4057
			(void) ddi_intr_remove_handler(qlge->htable[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4058
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4059
		if (qlge->sequence & INIT_INTR_ALLOC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4060
			rc = ddi_intr_free(qlge->htable[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4061
			if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4062
				/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4063
				QL_PRINT(DBG_INIT, ("Free intr failed: %d",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4064
				    rc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4065
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4066
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4067
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4068
	if (qlge->sequence & INIT_INTR_ALLOC)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4069
		qlge->sequence &= ~INIT_INTR_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4070
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4071
	if (qlge->sequence & INIT_ADD_INTERRUPT)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4072
		qlge->sequence &= ~INIT_ADD_INTERRUPT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4073
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4074
	if (qlge->htable) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4075
		kmem_free(qlge->htable, qlge->intr_size);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4076
		qlge->htable = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4077
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4078
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4079
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4080
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4081
 * Allocate interrupt vectors
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4082
 * For legacy and MSI, only 1 handle is needed.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4083
 * For MSI-X, if fewer than 2 vectors are available, return failure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4084
 * Upon success, this maps the vectors to rx and tx rings for
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4085
 * interrupts.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4086
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4087
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4088
ql_request_irq_vectors(qlge_t *qlge, int intr_type)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4089
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4090
	dev_info_t *devinfo;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4091
	uint32_t request, orig;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4092
	int count, avail, actual;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4093
	int minimum;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4094
	int rc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4095
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4096
	devinfo = qlge->dip;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4097
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4098
	switch (intr_type) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4099
	case DDI_INTR_TYPE_FIXED:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4100
		request = 1;	/* Request 1 legacy interrupt handle */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4101
		minimum = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4102
		QL_PRINT(DBG_INIT, ("interrupt type: legacy\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4103
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4104
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4105
	case DDI_INTR_TYPE_MSI:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4106
		request = 1;	/* Request 1 MSI interrupt handle */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4107
		minimum = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4108
		QL_PRINT(DBG_INIT, ("interrupt type: MSI\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4109
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4110
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4111
	case DDI_INTR_TYPE_MSIX:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4112
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4113
		 * Ideal number of vectors for the adapter is
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4114
		 * # rss rings + tx completion rings for default completion
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4115
		 * queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4116
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4117
		request = qlge->rx_ring_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4118
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4119
		orig = request;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4120
		if (request > (MAX_RX_RINGS))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4121
			request = MAX_RX_RINGS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4122
		minimum = 2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4123
		QL_PRINT(DBG_INIT, ("interrupt type: MSI-X\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4124
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4125
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4126
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4127
		QL_PRINT(DBG_INIT, ("Invalid parameter\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4128
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4129
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4130
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4131
	QL_PRINT(DBG_INIT, ("interrupt handles requested: %d  minimum: %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4132
	    request, minimum));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4133
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4134
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4135
	 * Get number of supported interrupts
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4136
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4137
	rc = ddi_intr_get_nintrs(devinfo, intr_type, &count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4138
	if ((rc != DDI_SUCCESS) || (count < minimum)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4139
		QL_PRINT(DBG_INIT, ("Get interrupt number failed. Return: %d, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4140
		    "count: %d\n", rc, count));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4141
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4142
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4143
	QL_PRINT(DBG_INIT, ("interrupts supported: %d\n", count));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4144
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4145
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4146
	 * Get number of available interrupts
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4147
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4148
	rc = ddi_intr_get_navail(devinfo, intr_type, &avail);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4149
	if ((rc != DDI_SUCCESS) || (avail < minimum)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4150
		QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4151
		    ("Get interrupt available number failed. Return:"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4152
		    " %d, available: %d\n", rc, avail));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4153
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4154
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4155
	QL_PRINT(DBG_INIT, ("interrupts available: %d\n", avail));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4156
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4157
	if (avail < request) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4158
		QL_PRINT(DBG_INIT, ("Request %d handles, %d available\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4159
		    request, avail));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4160
		request = avail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4161
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4162
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4163
	actual = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4164
	qlge->intr_cnt = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4165
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4166
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4167
	 * Allocate an array of interrupt handles
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4168
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4169
	qlge->intr_size = (size_t)(request * sizeof (ddi_intr_handle_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4170
	qlge->htable = kmem_alloc(qlge->intr_size, KM_SLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4171
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4172
	rc = ddi_intr_alloc(devinfo, qlge->htable, intr_type, 0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4173
	    (int)request, &actual, DDI_INTR_ALLOC_NORMAL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4174
	if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4175
		cmn_err(CE_WARN, "%s(%d) Allocate interrupts failed. return:"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4176
		    " %d, request: %d, actual: %d",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4177
		    __func__, qlge->instance, rc, request, actual);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4178
		goto ql_intr_alloc_fail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4179
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4180
	qlge->intr_cnt = actual;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4181
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4182
	qlge->sequence |= INIT_INTR_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4183
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4184
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4185
	 * If the actual number of vectors is less than the minumum
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4186
	 * then fail.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4187
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4188
	if (actual < minimum) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4189
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4190
		    "Insufficient interrupt handles available: %d", actual);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4191
		goto ql_intr_alloc_fail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4192
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4193
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4194
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4195
	 * For MSI-X, actual might force us to reduce number of tx & rx rings
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4196
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4197
	if ((intr_type == DDI_INTR_TYPE_MSIX) && (orig > actual)) {
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4198
		if (actual >= (orig / 2)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4199
			count = orig / 2;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4200
			qlge->rss_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4201
			qlge->tx_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4202
			qlge->isr_stride = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4203
		} else if (actual >= (orig / 4)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4204
			count = orig / 4;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4205
			qlge->rss_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4206
			qlge->tx_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4207
			qlge->isr_stride = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4208
		} else if (actual >= (orig / 8)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4209
			count = orig / 8;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4210
			qlge->rss_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4211
			qlge->tx_ring_count = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4212
			qlge->isr_stride = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4213
		} else if (actual < MAX_RX_RINGS) {
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4214
			qlge->tx_ring_count = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4215
			qlge->rss_ring_count = actual - 1;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4216
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4217
		qlge->intr_cnt = count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4218
		qlge->rx_ring_count = qlge->tx_ring_count +
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4219
		    qlge->rss_ring_count;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4220
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4221
	cmn_err(CE_NOTE, "!qlge(%d) tx %d, rss %d, stride %d\n", qlge->instance,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4222
	    qlge->tx_ring_count, qlge->rss_ring_count, qlge->isr_stride);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4223
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4224
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4225
	 * Get priority for first vector, assume remaining are all the same
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4226
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4227
	rc = ddi_intr_get_pri(qlge->htable[0], &qlge->intr_pri);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4228
	if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4229
		QL_PRINT(DBG_INIT, ("Get interrupt priority failed: %d\n", rc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4230
		goto ql_intr_alloc_fail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4231
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4232
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4233
	rc = ddi_intr_get_cap(qlge->htable[0], &qlge->intr_cap);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4234
	if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4235
		QL_PRINT(DBG_INIT, ("Get interrupt cap failed: %d\n", rc));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4236
		goto ql_intr_alloc_fail;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4237
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4238
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4239
	qlge->intr_type = intr_type;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4240
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4241
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4242
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4243
ql_intr_alloc_fail:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4244
	ql_free_irq_vectors(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4245
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4246
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4247
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4248
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4249
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4250
 * Allocate interrupt vector(s) for one of the following interrupt types, MSI-X,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4251
 * MSI or Legacy. In MSI and Legacy modes we only support a single receive and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4252
 * transmit queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4253
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4254
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4255
ql_alloc_irqs(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4256
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4257
	int intr_types;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4258
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4259
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4260
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4261
	 * Get supported interrupt types
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4262
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4263
	if (ddi_intr_get_supported_types(qlge->dip, &intr_types)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4264
	    != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4265
		cmn_err(CE_WARN, "%s(%d):ddi_intr_get_supported_types failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4266
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4267
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4268
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4269
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4270
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4271
	QL_PRINT(DBG_INIT, ("%s(%d) Interrupt types supported %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4272
	    __func__, qlge->instance, intr_types));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4273
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4274
	/* Install MSI-X interrupts */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4275
	if ((intr_types & DDI_INTR_TYPE_MSIX) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4276
		QL_PRINT(DBG_INIT, ("%s(%d) MSI-X interrupt supported %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4277
		    __func__, qlge->instance, intr_types));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4278
		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_MSIX);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4279
		if (rval == DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4280
			return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4281
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4282
		QL_PRINT(DBG_INIT, ("%s(%d) MSI-X interrupt allocation failed,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4283
		    " trying MSI interrupts ...\n", __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4284
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4285
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4286
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4287
	 * We will have 2 completion queues in MSI / Legacy mode,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4288
	 * Queue 0 for default completions
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4289
	 * Queue 1 for transmit completions
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4290
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4291
	qlge->rss_ring_count = 1; /* Default completion queue (0) for all */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4292
	qlge->tx_ring_count = 1; /* Single tx completion queue */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4293
	qlge->rx_ring_count = qlge->tx_ring_count + qlge->rss_ring_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4294
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4295
	QL_PRINT(DBG_INIT, ("%s(%d) Falling back to single completion queue \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4296
	    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4297
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4298
	 * Add the h/w interrupt handler and initialise mutexes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4299
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4300
	rval = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4301
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4302
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4303
	 * If OS supports MSIX interrupt but fails to allocate, then try
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4304
	 * MSI interrupt. If MSI interrupt allocation fails also, then roll
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4305
	 * back to fixed interrupt.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4306
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4307
	if (intr_types & DDI_INTR_TYPE_MSI) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4308
		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_MSI);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4309
		if (rval == DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4310
			qlge->intr_type = DDI_INTR_TYPE_MSI;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4311
			QL_PRINT(DBG_INIT, ("%s(%d) use MSI Interrupt \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4312
			    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4313
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4314
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4315
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4316
	/* Try Fixed interrupt Legacy mode */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4317
	if (rval != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4318
		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_FIXED);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4319
		if (rval != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4320
			cmn_err(CE_WARN, "%s(%d):Legacy mode interrupt "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4321
			    "allocation failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4322
			    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4323
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4324
			qlge->intr_type = DDI_INTR_TYPE_FIXED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4325
			QL_PRINT(DBG_INIT, ("%s(%d) use Fixed Interrupt \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4326
			    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4327
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4328
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4329
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4330
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4331
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4332
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4333
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4334
ql_free_rx_tx_locks(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4335
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4336
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4337
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4338
	struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4339
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4340
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4341
		tx_ring = &qlge->tx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4342
		mutex_destroy(&tx_ring->tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4343
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4344
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4345
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4346
		rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4347
		mutex_destroy(&rx_ring->rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4348
		mutex_destroy(&rx_ring->sbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4349
		mutex_destroy(&rx_ring->lbq_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4350
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4351
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4352
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4353
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4354
 * Frees all resources allocated during attach.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4355
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4356
 * Input:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4357
 * dip = pointer to device information structure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4358
 * sequence = bits indicating resources to free.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4359
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4360
 * Context:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4361
 * Kernel context.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4362
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4363
static void
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4364
ql_free_resources(qlge_t *qlge)
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4365
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4366
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4367
	/* Disable driver timer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4368
	ql_stop_timer(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4369
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4370
	if (qlge->sequence & INIT_MAC_REGISTERED) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4371
		(void) mac_unregister(qlge->mh);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4372
		qlge->sequence &= ~INIT_MAC_REGISTERED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4373
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4374
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4375
	if (qlge->sequence & INIT_MAC_ALLOC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4376
		/* Nothing to do, macp is already freed */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4377
		qlge->sequence &= ~INIT_MAC_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4378
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4379
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4380
	if (qlge->sequence & INIT_PCI_CONFIG_SETUP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4381
		pci_config_teardown(&qlge->pci_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4382
		qlge->sequence &= ~INIT_PCI_CONFIG_SETUP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4383
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4384
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4385
	if (qlge->sequence & INIT_ADD_INTERRUPT) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4386
		ql_free_irq_vectors(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4387
		qlge->sequence &= ~INIT_ADD_INTERRUPT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4388
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4389
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4390
	if (qlge->sequence & INIT_ADD_SOFT_INTERRUPT) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4391
		(void) ddi_intr_remove_softint(qlge->mpi_event_intr_hdl);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4392
		(void) ddi_intr_remove_softint(qlge->mpi_reset_intr_hdl);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4393
		(void) ddi_intr_remove_softint(qlge->asic_reset_intr_hdl);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4394
		qlge->sequence &= ~INIT_ADD_SOFT_INTERRUPT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4395
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4396
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4397
	if (qlge->sequence & INIT_KSTATS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4398
		ql_fini_kstats(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4399
		qlge->sequence &= ~INIT_KSTATS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4400
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4401
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4402
	if (qlge->sequence & INIT_MUTEX) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4403
		mutex_destroy(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4404
		mutex_destroy(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4405
		mutex_destroy(&qlge->mbx_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4406
		cv_destroy(&qlge->cv_mbx_intr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4407
		qlge->sequence &= ~INIT_MUTEX;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4408
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4409
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4410
	if (qlge->sequence & INIT_LOCKS_CREATED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4411
		ql_free_rx_tx_locks(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4412
		qlge->sequence &= ~INIT_LOCKS_CREATED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4413
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4414
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4415
	if (qlge->sequence & INIT_MEMORY_ALLOC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4416
		ql_free_mem_resources(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4417
		qlge->sequence &= ~INIT_MEMORY_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4418
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4419
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4420
	if (qlge->sequence & INIT_REGS_SETUP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4421
		ddi_regs_map_free(&qlge->dev_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4422
		qlge->sequence &= ~INIT_REGS_SETUP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4423
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4424
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4425
	if (qlge->sequence & INIT_DOORBELL_REGS_SETUP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4426
		ddi_regs_map_free(&qlge->dev_doorbell_reg_handle);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4427
		qlge->sequence &= ~INIT_DOORBELL_REGS_SETUP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4428
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4429
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4430
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4431
	 * free flash flt table that allocated in attach stage
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4432
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4433
	if ((qlge->flt.ql_flt_entry_ptr != NULL)&&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4434
	    (qlge->flt.header.length != 0)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4435
		kmem_free(qlge->flt.ql_flt_entry_ptr, qlge->flt.header.length);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4436
		qlge->flt.ql_flt_entry_ptr = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4437
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4438
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4439
	if (qlge->sequence & INIT_FM) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4440
		ql_fm_fini(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4441
		qlge->sequence &= ~INIT_FM;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4442
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4443
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4444
	ddi_prop_remove_all(qlge->dip);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4445
	ddi_set_driver_private(qlge->dip, NULL);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4446
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4447
	/* finally, free qlge structure */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4448
	if (qlge->sequence & INIT_SOFTSTATE_ALLOC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4449
		kmem_free(qlge, sizeof (qlge_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4450
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4451
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4452
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4453
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4454
 * Set promiscuous mode of the driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4455
 * Caller must catch HW_LOCK
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4456
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4457
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4458
ql_set_promiscuous(qlge_t *qlge, int mode)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4459
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4460
	if (mode) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4461
		(void) ql_set_routing_reg(qlge, RT_IDX_PROMISCUOUS_SLOT,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4462
		    RT_IDX_VALID, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4463
	} else {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4464
		(void) ql_set_routing_reg(qlge, RT_IDX_PROMISCUOUS_SLOT,
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4465
		    RT_IDX_VALID, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4466
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4467
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4468
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4469
 * Write 'data1' to Mac Protocol Address Index Register and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4470
 * 'data2' to Mac Protocol Address Data Register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4471
 *  Assuming that the Mac Protocol semaphore lock has been acquired.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4472
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4473
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4474
ql_write_mac_proto_regs(qlge_t *qlge, uint32_t data1, uint32_t data2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4475
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4476
	int return_value = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4477
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4478
	if (ql_wait_reg_bit(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4479
	    MAC_PROTOCOL_ADDRESS_INDEX_MW, BIT_SET, 5) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4480
		cmn_err(CE_WARN, "Wait for MAC_PROTOCOL Address Register "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4481
		    "timeout.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4482
		return_value = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4483
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4484
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4485
	ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX /* A8 */, data1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4486
	ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA /* 0xAC */, data2);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4487
out:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4488
	return (return_value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4489
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4490
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4491
 * Enable the 'index'ed multicast address in the host memory's multicast_list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4492
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4493
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4494
ql_add_multicast_address(qlge_t *qlge, int index)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4495
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4496
	int rtn_val = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4497
	uint32_t offset;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4498
	uint32_t value1, value2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4499
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4500
	/* Acquire the required semaphore */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4501
	if (ql_sem_spinlock(qlge, QL_MAC_PROTOCOL_SEM_MASK) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4502
		return (rtn_val);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4503
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4504
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4505
	/* Program Offset0 - lower 32 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4506
	offset = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4507
	value1 = MAC_PROTOCOL_ADDRESS_ENABLE | MAC_PROTOCOL_TYPE_MULTICAST |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4508
	    (index << 4) | offset;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4509
	value2 = ((qlge->multicast_list[index].addr.ether_addr_octet[2] << 24)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4510
	    |(qlge->multicast_list[index].addr.ether_addr_octet[3] << 16)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4511
	    |(qlge->multicast_list[index].addr.ether_addr_octet[4] << 8)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4512
	    |(qlge->multicast_list[index].addr.ether_addr_octet[5]));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4513
	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4514
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4515
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4516
	/* Program offset1: upper 16 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4517
	offset = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4518
	value1 = MAC_PROTOCOL_ADDRESS_ENABLE | MAC_PROTOCOL_TYPE_MULTICAST |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4519
	    (index<<4) | offset;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4520
	value2 = ((qlge->multicast_list[index].addr.ether_addr_octet[0] << 8)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4521
	    |qlge->multicast_list[index].addr.ether_addr_octet[1]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4522
	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4523
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4524
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4525
	rtn_val = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4526
out:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4527
	ql_sem_unlock(qlge, QL_MAC_PROTOCOL_SEM_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4528
	return (rtn_val);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4529
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4530
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4531
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4532
 * Disable the 'index'ed multicast address in the host memory's multicast_list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4533
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4534
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4535
ql_remove_multicast_address(qlge_t *qlge, int index)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4536
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4537
	int rtn_val = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4538
	uint32_t offset;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4539
	uint32_t value1, value2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4540
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4541
	/* Acquire the required semaphore */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4542
	if (ql_sem_spinlock(qlge, QL_MAC_PROTOCOL_SEM_MASK) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4543
		return (rtn_val);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4544
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4545
	/* Program Offset0 - lower 32 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4546
	offset = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4547
	value1 = (MAC_PROTOCOL_TYPE_MULTICAST | offset)|(index<<4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4548
	value2 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4549
	    ((qlge->multicast_list[index].addr.ether_addr_octet[2] << 24)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4550
	    |(qlge->multicast_list[index].addr.ether_addr_octet[3] << 16)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4551
	    |(qlge->multicast_list[index].addr.ether_addr_octet[4] << 8)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4552
	    |(qlge->multicast_list[index].addr.ether_addr_octet[5]));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4553
	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4554
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4555
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4556
	/* Program offset1: upper 16 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4557
	offset = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4558
	value1 = (MAC_PROTOCOL_TYPE_MULTICAST | offset)|(index<<4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4559
	value2 = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4560
	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4561
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4562
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4563
	rtn_val = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4564
out:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4565
	ql_sem_unlock(qlge, QL_MAC_PROTOCOL_SEM_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4566
	return (rtn_val);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4567
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4568
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4569
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4570
 * Add a new multicast address to the list of supported list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4571
 * This API is called after OS called gld_set_multicast (GLDv2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4572
 * or m_multicst (GLDv3)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4573
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4574
 * Restriction:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4575
 * The number of maximum multicast address is limited by hardware.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4576
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4577
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4578
ql_add_to_multicast_list(qlge_t *qlge, uint8_t *ep)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4579
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4580
	uint32_t index = qlge->multicast_list_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4581
	int rval = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4582
	int status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4583
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4584
	if ((ep[0] & 01) == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4585
		rval = EINVAL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4586
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4587
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4588
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4589
	/* if there is an availabe space in multicast_list, then add it */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4590
	if (index < MAX_MULTICAST_LIST_SIZE) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4591
		bcopy(ep, qlge->multicast_list[index].addr.ether_addr_octet,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4592
		    ETHERADDRL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4593
		/* increment the total number of addresses in multicast list */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4594
		(void) ql_add_multicast_address(qlge, index);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4595
		qlge->multicast_list_count++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4596
		QL_PRINT(DBG_GLD,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4597
		    ("%s(%d): added to index of multicast list= 0x%x, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4598
		    "total %d\n", __func__, qlge->instance, index,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4599
		    qlge->multicast_list_count));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4600
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4601
		if (index > MAX_MULTICAST_HW_SIZE) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4602
			if (!qlge->multicast_promisc) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4603
				status = ql_set_routing_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4604
				    RT_IDX_ALLMULTI_SLOT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4605
				    RT_IDX_MCAST, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4606
				if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4607
					cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4608
					    "Failed to init routing reg "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4609
					    "for mcast promisc mode.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4610
					rval = ENOENT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4611
					goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4612
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4613
				qlge->multicast_promisc = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4614
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4615
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4616
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4617
		rval = ENOENT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4618
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4619
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4620
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4621
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4622
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4623
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4624
 * Remove an old multicast address from the list of supported multicast
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4625
 * addresses. This API is called after OS called gld_set_multicast (GLDv2)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4626
 * or m_multicst (GLDv3)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4627
 * The number of maximum multicast address is limited by hardware.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4628
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4629
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4630
ql_remove_from_multicast_list(qlge_t *qlge, uint8_t *ep)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4631
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4632
	uint32_t total = qlge->multicast_list_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4633
	int i = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4634
	int rmv_index = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4635
	size_t length = sizeof (ql_multicast_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4636
	int status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4637
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4638
	for (i = 0; i < total; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4639
		if (bcmp(ep, &qlge->multicast_list[i].addr, ETHERADDRL) != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4640
			continue;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4641
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4642
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4643
		rmv_index = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4644
		/* block move the reset of other multicast address forward */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4645
		length = ((total -1) -i) * sizeof (ql_multicast_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4646
		if (length > 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4647
			bcopy(&qlge->multicast_list[i+1],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4648
			    &qlge->multicast_list[i], length);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4649
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4650
		qlge->multicast_list_count--;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4651
		if (qlge->multicast_list_count <= MAX_MULTICAST_HW_SIZE) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4652
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4653
			 * there is a deletion in multicast list table,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4654
			 * re-enable them
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4655
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4656
			for (i = rmv_index; i < qlge->multicast_list_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4657
			    i++) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4658
				(void) ql_add_multicast_address(qlge, i);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4659
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4660
			/* and disable the last one */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  4661
			(void) ql_remove_multicast_address(qlge, i);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4662
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4663
			/* disable multicast promiscuous mode */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4664
			if (qlge->multicast_promisc) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4665
				status = ql_set_routing_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4666
				    RT_IDX_ALLMULTI_SLOT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4667
				    RT_IDX_MCAST, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4668
				if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4669
					cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4670
					    "Failed to init routing reg for "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4671
					    "mcast promisc mode.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4672
					goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4673
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4674
				/* write to config register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4675
				qlge->multicast_promisc = B_FALSE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4676
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4677
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4678
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4679
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4680
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4681
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4682
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4683
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4684
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4685
 * Read a XGMAC register
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4686
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4687
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4688
ql_read_xgmac_reg(qlge_t *qlge, uint32_t addr, uint32_t *val)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4689
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4690
	int rtn_val = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4691
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4692
	/* wait for XGMAC Address register RDY bit set */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4693
	if (ql_wait_reg_bit(qlge, REG_XGMAC_ADDRESS, XGMAC_ADDRESS_RDY,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4694
	    BIT_SET, 10) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4695
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4696
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4697
	/* start rx transaction */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4698
	ql_write_reg(qlge, REG_XGMAC_ADDRESS, addr|XGMAC_ADDRESS_READ_TRANSACT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4699
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4700
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4701
	 * wait for XGMAC Address register RDY bit set,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4702
	 * which indicates data is ready
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4703
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4704
	if (ql_wait_reg_bit(qlge, REG_XGMAC_ADDRESS, XGMAC_ADDRESS_RDY,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4705
	    BIT_SET, 10) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4706
		goto out;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4707
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4708
	/* read data from XGAMC_DATA register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4709
	*val = ql_read_reg(qlge, REG_XGMAC_DATA);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4710
	rtn_val = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4711
out:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4712
	return (rtn_val);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4713
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4714
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4715
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4716
 * Implement checksum offload for IPv4 IP packets
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4717
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4718
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4719
ql_hw_csum_setup(qlge_t *qlge, uint32_t pflags, caddr_t bp,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4720
    struct ob_mac_iocb_req *mac_iocb_ptr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4721
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4722
	struct ip *iphdr = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4723
	struct ether_header *ethhdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4724
	struct ether_vlan_header *ethvhdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4725
	struct tcphdr *tcp_hdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4726
	uint32_t etherType;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4727
	int mac_hdr_len, ip_hdr_len, tcp_udp_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4728
	int ip_hdr_off, tcp_udp_hdr_off, hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4729
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4730
	ethhdr  = (struct ether_header *)((void *)bp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4731
	ethvhdr = (struct ether_vlan_header *)((void *)bp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4732
	/* Is this vlan packet? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4733
	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4734
		mac_hdr_len = sizeof (struct ether_vlan_header);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4735
		etherType = ntohs(ethvhdr->ether_type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4736
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4737
		mac_hdr_len = sizeof (struct ether_header);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4738
		etherType = ntohs(ethhdr->ether_type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4739
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4740
	/* Is this IPv4 or IPv6 packet? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4741
	if (IPH_HDR_VERSION((ipha_t *)(void *)(bp+mac_hdr_len)) ==
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4742
	    IPV4_VERSION) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4743
		if (etherType == ETHERTYPE_IP /* 0800 */) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4744
			iphdr = (struct ip *)(void *)(bp+mac_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4745
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4746
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4747
			QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4748
			    ("%s(%d) : IPv4 None IP packet type 0x%x\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4749
			    __func__, qlge->instance, etherType));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4750
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4751
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4752
	/* ipV4 packets */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4753
	if (iphdr != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4754
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4755
		ip_hdr_len = IPH_HDR_LENGTH(iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4756
		QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4757
		    ("%s(%d) : IPv4 header length using IPH_HDR_LENGTH:"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4758
		    " %d bytes \n", __func__, qlge->instance, ip_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4759
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4760
		ip_hdr_off = mac_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4761
		QL_PRINT(DBG_TX, ("%s(%d) : ip_hdr_len=%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4762
		    __func__, qlge->instance, ip_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4763
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4764
		mac_iocb_ptr->flag0 = (uint8_t)(mac_iocb_ptr->flag0 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4765
		    OB_MAC_IOCB_REQ_IPv4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4766
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4767
		if (pflags & HCK_IPV4_HDRCKSUM) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4768
			QL_PRINT(DBG_TX, ("%s(%d) : Do IPv4 header checksum\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4769
			    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4770
			mac_iocb_ptr->opcode = OPCODE_OB_MAC_OFFLOAD_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4771
			mac_iocb_ptr->flag2 = (uint8_t)(mac_iocb_ptr->flag2 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4772
			    OB_MAC_IOCB_REQ_IC);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4773
			iphdr->ip_sum = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4774
			mac_iocb_ptr->hdr_off = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4775
			    cpu_to_le16(ip_hdr_off);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4776
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4777
		if (pflags & HCK_FULLCKSUM) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4778
			if (iphdr->ip_p == IPPROTO_TCP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4779
				tcp_hdr =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4780
				    (struct tcphdr *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4781
				    ((uint8_t *)(void *)iphdr + ip_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4782
				QL_PRINT(DBG_TX, ("%s(%d) : Do TCP checksum\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4783
				    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4784
				mac_iocb_ptr->opcode =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4785
				    OPCODE_OB_MAC_OFFLOAD_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4786
				mac_iocb_ptr->flag1 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4787
				    (uint8_t)(mac_iocb_ptr->flag1 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4788
				    OB_MAC_IOCB_REQ_TC);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4789
				mac_iocb_ptr->flag2 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4790
				    (uint8_t)(mac_iocb_ptr->flag2 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4791
				    OB_MAC_IOCB_REQ_IC);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4792
				iphdr->ip_sum = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4793
				tcp_udp_hdr_off = mac_hdr_len+ip_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4794
				tcp_udp_hdr_len = tcp_hdr->th_off*4;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4795
				QL_PRINT(DBG_TX, ("%s(%d): tcp header len:%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4796
				    __func__, qlge->instance, tcp_udp_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4797
				hdr_off = ip_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4798
				tcp_udp_hdr_off <<= 6;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4799
				hdr_off |= tcp_udp_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4800
				mac_iocb_ptr->hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4801
				    (uint16_t)cpu_to_le16(hdr_off);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4802
				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4803
				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4804
				    tcp_udp_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4805
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4806
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4807
				 * if the chip is unable to do pseudo header
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4808
				 * cksum calculation, do it in then put the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4809
				 * result to the data passed to the chip
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4810
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4811
				if (qlge->cfg_flags &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4812
				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4813
					ql_pseudo_cksum((uint8_t *)iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4814
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4815
			} else if (iphdr->ip_p == IPPROTO_UDP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4816
				QL_PRINT(DBG_TX, ("%s(%d) : Do UDP checksum\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4817
				    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4818
				mac_iocb_ptr->opcode =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4819
				    OPCODE_OB_MAC_OFFLOAD_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4820
				mac_iocb_ptr->flag1 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4821
				    (uint8_t)(mac_iocb_ptr->flag1 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4822
				    OB_MAC_IOCB_REQ_UC);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4823
				mac_iocb_ptr->flag2 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4824
				    (uint8_t)(mac_iocb_ptr->flag2 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4825
				    OB_MAC_IOCB_REQ_IC);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4826
				iphdr->ip_sum = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4827
				tcp_udp_hdr_off = mac_hdr_len + ip_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4828
				tcp_udp_hdr_len = sizeof (struct udphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4829
				QL_PRINT(DBG_TX, ("%s(%d):udp header len:%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4830
				    __func__, qlge->instance, tcp_udp_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4831
				hdr_off = ip_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4832
				tcp_udp_hdr_off <<= 6;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4833
				hdr_off |= tcp_udp_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4834
				mac_iocb_ptr->hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4835
				    (uint16_t)cpu_to_le16(hdr_off);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4836
				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4837
				    cpu_to_le16(mac_hdr_len + ip_hdr_len
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4838
				    + tcp_udp_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4839
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4840
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4841
				 * if the chip is unable to calculate pseudo
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4842
				 * hdr cksum,do it in then put the result to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4843
				 * the data passed to the chip
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4844
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4845
				if (qlge->cfg_flags &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4846
				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4847
					ql_pseudo_cksum((uint8_t *)iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4848
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4849
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4850
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4851
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4852
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4853
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4854
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4855
 * For TSO/LSO:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4856
 * MAC frame transmission with TCP large segment offload is performed in the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4857
 * same way as the MAC frame transmission with checksum offload with the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4858
 * exception that the maximum TCP segment size (MSS) must be specified to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4859
 * allow the chip to segment the data into legal sized frames.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4860
 * The host also needs to calculate a pseudo-header checksum over the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4861
 * following fields:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4862
 * Source IP Address, Destination IP Address, and the Protocol.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4863
 * The TCP length is not included in the pseudo-header calculation.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4864
 * The pseudo-header checksum is place in the TCP checksum field of the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4865
 * prototype header.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4866
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4867
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4868
ql_lso_pseudo_cksum(uint8_t *buf)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4869
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4870
	uint32_t cksum;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4871
	uint16_t iphl;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4872
	uint16_t proto;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4873
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4874
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4875
	 * Calculate the LSO pseudo-header checksum.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4876
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4877
	iphl = (uint16_t)(4 * (buf[0] & 0xF));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4878
	cksum = proto = buf[9];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4879
	cksum += (((uint16_t)buf[12])<<8) + buf[13];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4880
	cksum += (((uint16_t)buf[14])<<8) + buf[15];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4881
	cksum += (((uint16_t)buf[16])<<8) + buf[17];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4882
	cksum += (((uint16_t)buf[18])<<8) + buf[19];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4883
	cksum = (cksum>>16) + (cksum & 0xFFFF);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4884
	cksum = (cksum>>16) + (cksum & 0xFFFF);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4885
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4886
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4887
	 * Point it to the TCP/UDP header, and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4888
	 * update the checksum field.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4889
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4890
	buf += iphl + ((proto == IPPROTO_TCP) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4891
	    TCP_CKSUM_OFFSET : UDP_CKSUM_OFFSET);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4892
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4893
	*(uint16_t *)(void *)buf = (uint16_t)htons((uint16_t)cksum);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4894
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4895
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  4896
/*
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4897
 * For IPv4 IP packets, distribute the tx packets evenly among tx rings
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4898
 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4899
typedef	uint32_t	ub4; /* unsigned 4-byte quantities */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4900
typedef	uint8_t		ub1;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4901
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4902
#define	hashsize(n)	((ub4)1<<(n))
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4903
#define	hashmask(n)	(hashsize(n)-1)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4904
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4905
#define	mix(a, b, c) \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4906
{ \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4907
	a -= b; a -= c; a ^= (c>>13); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4908
	b -= c; b -= a; b ^= (a<<8); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4909
	c -= a; c -= b; c ^= (b>>13); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4910
	a -= b; a -= c; a ^= (c>>12);  \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4911
	b -= c; b -= a; b ^= (a<<16); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4912
	c -= a; c -= b; c ^= (b>>5); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4913
	a -= b; a -= c; a ^= (c>>3);  \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4914
	b -= c; b -= a; b ^= (a<<10); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4915
	c -= a; c -= b; c ^= (b>>15); \
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4916
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4917
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4918
ub4
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4919
hash(k, length, initval)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4920
register ub1 *k;	/* the key */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4921
register ub4 length;	/* the length of the key */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4922
register ub4 initval;	/* the previous hash, or an arbitrary value */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4923
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4924
	register ub4 a, b, c, len;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4925
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4926
	/* Set up the internal state */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4927
	len = length;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4928
	a = b = 0x9e3779b9;	/* the golden ratio; an arbitrary value */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4929
	c = initval;		/* the previous hash value */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4930
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4931
	/* handle most of the key */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4932
	while (len >= 12) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4933
		a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4934
		b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4935
		c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4936
		mix(a, b, c);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4937
		k += 12;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4938
		len -= 12;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4939
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4940
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4941
	/* handle the last 11 bytes */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4942
	c += length;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4943
	/* all the case statements fall through */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4944
	switch (len) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4945
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4946
	case 11: c += ((ub4)k[10]<<24);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4947
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4948
	case 10: c += ((ub4)k[9]<<16);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4949
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4950
	case 9 : c += ((ub4)k[8]<<8);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4951
	/* the first byte of c is reserved for the length */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4952
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4953
	case 8 : b += ((ub4)k[7]<<24);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4954
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4955
	case 7 : b += ((ub4)k[6]<<16);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4956
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4957
	case 6 : b += ((ub4)k[5]<<8);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4958
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4959
	case 5 : b += k[4];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4960
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4961
	case 4 : a += ((ub4)k[3]<<24);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4962
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4963
	case 3 : a += ((ub4)k[2]<<16);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4964
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4965
	case 2 : a += ((ub4)k[1]<<8);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4966
		/* FALLTHRU */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4967
	case 1 : a += k[0];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4968
	/* case 0: nothing left to add */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4969
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4970
	mix(a, b, c);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4971
	/* report the result */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4972
	return (c);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4973
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4974
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4975
uint8_t
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4976
ql_tx_hashing(qlge_t *qlge, caddr_t bp)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4977
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4978
	struct ip *iphdr = NULL;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4979
	struct ether_header *ethhdr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4980
	struct ether_vlan_header *ethvhdr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4981
	struct tcphdr *tcp_hdr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4982
	struct udphdr *udp_hdr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4983
	uint32_t etherType;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4984
	int mac_hdr_len, ip_hdr_len;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4985
	uint32_t h = 0; /* 0 by default */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4986
	uint8_t tx_ring_id = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4987
	uint32_t ip_src_addr = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4988
	uint32_t ip_desc_addr = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4989
	uint16_t src_port = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4990
	uint16_t dest_port = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4991
	uint8_t key[12];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4992
	QL_PRINT(DBG_TX, ("%s(%d) entered \n", __func__, qlge->instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4993
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4994
	ethhdr = (struct ether_header *)((void *)bp);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4995
	ethvhdr = (struct ether_vlan_header *)((void *)bp);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4996
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4997
	if (qlge->tx_ring_count == 1)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4998
		return (tx_ring_id);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  4999
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5000
	/* Is this vlan packet? */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5001
	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5002
		mac_hdr_len = sizeof (struct ether_vlan_header);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5003
		etherType = ntohs(ethvhdr->ether_type);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5004
	} else {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5005
		mac_hdr_len = sizeof (struct ether_header);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5006
		etherType = ntohs(ethhdr->ether_type);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5007
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5008
	/* Is this IPv4 or IPv6 packet? */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5009
	if (etherType == ETHERTYPE_IP /* 0800 */) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5010
		if (IPH_HDR_VERSION((ipha_t *)(void *)(bp+mac_hdr_len))
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5011
		    == IPV4_VERSION) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5012
			iphdr = (struct ip *)(void *)(bp+mac_hdr_len);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5013
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5014
		if (((unsigned long)iphdr) & 0x3) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5015
			/*  IP hdr not 4-byte aligned */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5016
			return (tx_ring_id);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5017
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5018
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5019
	/* ipV4 packets */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5020
	if (iphdr) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5021
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5022
		ip_hdr_len = IPH_HDR_LENGTH(iphdr);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5023
		ip_src_addr = iphdr->ip_src.s_addr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5024
		ip_desc_addr = iphdr->ip_dst.s_addr;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5025
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5026
		if (iphdr->ip_p == IPPROTO_TCP) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5027
			tcp_hdr = (struct tcphdr *)(void *)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5028
			    ((uint8_t *)iphdr + ip_hdr_len);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5029
			src_port = tcp_hdr->th_sport;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5030
			dest_port = tcp_hdr->th_dport;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5031
		} else if (iphdr->ip_p == IPPROTO_UDP) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5032
			udp_hdr = (struct udphdr *)(void *)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5033
			    ((uint8_t *)iphdr + ip_hdr_len);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5034
			src_port = udp_hdr->uh_sport;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5035
			dest_port = udp_hdr->uh_dport;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5036
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5037
		key[0] = (uint8_t)((ip_src_addr) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5038
		key[1] = (uint8_t)((ip_src_addr >> 8) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5039
		key[2] = (uint8_t)((ip_src_addr >> 16) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5040
		key[3] = (uint8_t)((ip_src_addr >> 24) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5041
		key[4] = (uint8_t)((ip_desc_addr) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5042
		key[5] = (uint8_t)((ip_desc_addr >> 8) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5043
		key[6] = (uint8_t)((ip_desc_addr >> 16) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5044
		key[7] = (uint8_t)((ip_desc_addr >> 24) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5045
		key[8] = (uint8_t)((src_port) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5046
		key[9] = (uint8_t)((src_port >> 8) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5047
		key[10] = (uint8_t)((dest_port) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5048
		key[11] = (uint8_t)((dest_port >> 8) &0xFF);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5049
		h = hash(key, 12, 0); /* return 32 bit */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5050
		tx_ring_id = (h & (qlge->tx_ring_count - 1));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5051
		if (tx_ring_id >= qlge->tx_ring_count) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5052
			cmn_err(CE_WARN, "%s bad tx_ring_id %d\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5053
			    __func__, tx_ring_id);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5054
			tx_ring_id = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5055
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5056
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5057
	return (tx_ring_id);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5058
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5059
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5060
/*
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5061
 * Tell the hardware to do Large Send Offload (LSO)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5062
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5063
 * Some fields in ob_mac_iocb need to be set so hardware can know what is
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5064
 * the incoming packet, TCP or UDP, whether a VLAN tag needs to be inserted
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5065
 * in the right place of the packet etc, thus, hardware can process the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5066
 * packet correctly.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5067
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5068
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5069
ql_hw_lso_setup(qlge_t *qlge, uint32_t mss, caddr_t bp,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5070
    struct ob_mac_iocb_req *mac_iocb_ptr)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5071
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5072
	struct ip *iphdr = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5073
	struct ether_header *ethhdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5074
	struct ether_vlan_header *ethvhdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5075
	struct tcphdr *tcp_hdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5076
	struct udphdr *udp_hdr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5077
	uint32_t etherType;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5078
	uint16_t mac_hdr_len, ip_hdr_len, tcp_udp_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5079
	uint16_t ip_hdr_off, tcp_udp_hdr_off, hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5080
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5081
	ethhdr = (struct ether_header *)(void *)bp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5082
	ethvhdr = (struct ether_vlan_header *)(void *)bp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5083
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5084
	/* Is this vlan packet? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5085
	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5086
		mac_hdr_len = sizeof (struct ether_vlan_header);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5087
		etherType = ntohs(ethvhdr->ether_type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5088
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5089
		mac_hdr_len = sizeof (struct ether_header);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5090
		etherType = ntohs(ethhdr->ether_type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5091
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5092
	/* Is this IPv4 or IPv6 packet? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5093
	if (IPH_HDR_VERSION((ipha_t *)(void *)(bp + mac_hdr_len)) ==
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5094
	    IPV4_VERSION) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5095
		if (etherType == ETHERTYPE_IP /* 0800 */) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5096
			iphdr 	= (struct ip *)(void *)(bp+mac_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5097
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5098
			/* EMPTY */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5099
			QL_PRINT(DBG_TX, ("%s(%d) : IPv4 None IP packet"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5100
			    " type 0x%x\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5101
			    __func__, qlge->instance, etherType));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5102
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5103
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5104
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5105
	if (iphdr != NULL) { /* ipV4 packets */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5106
		ip_hdr_len = (uint16_t)IPH_HDR_LENGTH(iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5107
		QL_PRINT(DBG_TX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5108
		    ("%s(%d) : IPv4 header length using IPH_HDR_LENGTH: %d"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5109
		    " bytes \n", __func__, qlge->instance, ip_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5110
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5111
		ip_hdr_off = mac_hdr_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5112
		QL_PRINT(DBG_TX, ("%s(%d) : ip_hdr_len=%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5113
		    __func__, qlge->instance, ip_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5114
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5115
		mac_iocb_ptr->flag0 = (uint8_t)(mac_iocb_ptr->flag0 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5116
		    OB_MAC_IOCB_REQ_IPv4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5117
		if (qlge->cfg_flags & CFG_CKSUM_FULL_IPv4) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5118
			if (iphdr->ip_p == IPPROTO_TCP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5119
				tcp_hdr = (struct tcphdr *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5120
				    ((uint8_t *)(void *)iphdr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5121
				    ip_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5122
				QL_PRINT(DBG_TX, ("%s(%d) : Do TSO on TCP "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5123
				    "packet\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5124
				    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5125
				mac_iocb_ptr->opcode =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5126
				    OPCODE_OB_MAC_OFFLOAD_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5127
				mac_iocb_ptr->flag1 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5128
				    (uint8_t)(mac_iocb_ptr->flag1 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5129
				    OB_MAC_IOCB_REQ_LSO);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5130
				iphdr->ip_sum = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5131
				tcp_udp_hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5132
				    (uint16_t)(mac_hdr_len+ip_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5133
				tcp_udp_hdr_len =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5134
				    (uint16_t)(tcp_hdr->th_off*4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5135
				QL_PRINT(DBG_TX, ("%s(%d): tcp header len:%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5136
				    __func__, qlge->instance, tcp_udp_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5137
				hdr_off = ip_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5138
				tcp_udp_hdr_off <<= 6;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5139
				hdr_off |= tcp_udp_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5140
				mac_iocb_ptr->hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5141
				    (uint16_t)cpu_to_le16(hdr_off);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5142
				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5143
				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5144
				    tcp_udp_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5145
				mac_iocb_ptr->mss = (uint16_t)cpu_to_le16(mss);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5146
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5147
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5148
				 * if the chip is unable to calculate pseudo
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5149
				 * header checksum, do it in then put the result
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5150
				 * to the data passed to the chip
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5151
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5152
				if (qlge->cfg_flags &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5153
				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5154
					ql_lso_pseudo_cksum((uint8_t *)iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5155
			} else if (iphdr->ip_p == IPPROTO_UDP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5156
				udp_hdr = (struct udphdr *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5157
				    ((uint8_t *)(void *)iphdr
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5158
				    + ip_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5159
				QL_PRINT(DBG_TX, ("%s(%d) : Do TSO on UDP "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5160
				    "packet\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5161
				    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5162
				mac_iocb_ptr->opcode =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5163
				    OPCODE_OB_MAC_OFFLOAD_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5164
				mac_iocb_ptr->flag1 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5165
				    (uint8_t)(mac_iocb_ptr->flag1 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5166
				    OB_MAC_IOCB_REQ_LSO);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5167
				iphdr->ip_sum = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5168
				tcp_udp_hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5169
				    (uint16_t)(mac_hdr_len+ip_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5170
				tcp_udp_hdr_len =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5171
				    (uint16_t)(udp_hdr->uh_ulen*4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5172
				QL_PRINT(DBG_TX, ("%s(%d):udp header len:%d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5173
				    __func__, qlge->instance, tcp_udp_hdr_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5174
				hdr_off = ip_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5175
				tcp_udp_hdr_off <<= 6;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5176
				hdr_off |= tcp_udp_hdr_off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5177
				mac_iocb_ptr->hdr_off =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5178
				    (uint16_t)cpu_to_le16(hdr_off);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5179
				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5180
				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5181
				    tcp_udp_hdr_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5182
				mac_iocb_ptr->mss = (uint16_t)cpu_to_le16(mss);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5183
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5184
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5185
				 * if the chip is unable to do pseudo header
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5186
				 * checksum calculation, do it here then put the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5187
				 * result to the data passed to the chip
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5188
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5189
				if (qlge->cfg_flags &
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5190
				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5191
					ql_lso_pseudo_cksum((uint8_t *)iphdr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5192
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5193
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5194
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5195
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5196
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5197
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5198
 * Generic packet sending function which is used to send one packet.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5199
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5200
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5201
ql_send_common(struct tx_ring *tx_ring, mblk_t *mp)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5202
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5203
	struct tx_ring_desc *tx_cb;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5204
	struct ob_mac_iocb_req *mac_iocb_ptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5205
	mblk_t *tp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5206
	size_t msg_len = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5207
	size_t off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5208
	caddr_t bp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5209
	size_t nbyte, total_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5210
	uint_t i = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5211
	int j = 0, frags = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5212
	uint32_t phy_addr_low, phy_addr_high;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5213
	uint64_t phys_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5214
	clock_t now;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5215
	uint32_t pflags = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5216
	uint32_t mss = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5217
	enum tx_mode_t tx_mode;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5218
	struct oal_entry *oal_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5219
	int status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5220
	uint_t ncookies, oal_entries, max_oal_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5221
	size_t max_seg_len = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5222
	boolean_t use_lso = B_FALSE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5223
	struct oal_entry *tx_entry = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5224
	struct oal_entry *last_oal_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5225
	qlge_t *qlge = tx_ring->qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5226
	ddi_dma_cookie_t dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5227
	size_t tx_buf_len = QL_MAX_COPY_LENGTH;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5228
	int force_pullup = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5229
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5230
	tp = mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5231
	total_len = msg_len = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5232
	max_oal_entries = TX_DESC_PER_IOCB + MAX_SG_ELEMENTS-1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5233
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5234
	/* Calculate number of data and segments in the incoming message */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5235
	for (tp = mp; tp != NULL; tp = tp->b_cont) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5236
		nbyte = MBLKL(tp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5237
		total_len += nbyte;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5238
		max_seg_len = max(nbyte, max_seg_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5239
		QL_PRINT(DBG_TX, ("Requested sending data in %d segments, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5240
		    "total length: %d\n", frags, nbyte));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5241
		frags++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5242
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5243
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5244
	if (total_len >= QL_LSO_MAX) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5245
		freemsg(mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5246
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5247
		cmn_err(CE_NOTE, "%s: quit, packet oversize %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5248
		    __func__, (int)total_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5249
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5250
		return (NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5251
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5252
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5253
	bp = (caddr_t)mp->b_rptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5254
	if (bp[0] & 1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5255
		if (bcmp(bp, ql_ether_broadcast_addr.ether_addr_octet,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5256
		    ETHERADDRL) == 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5257
			QL_PRINT(DBG_TX, ("Broadcast packet\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5258
			tx_ring->brdcstxmt++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5259
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5260
			QL_PRINT(DBG_TX, ("multicast packet\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5261
			tx_ring->multixmt++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5262
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5263
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5264
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5265
	tx_ring->obytes += total_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5266
	tx_ring->opackets ++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5267
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5268
	QL_PRINT(DBG_TX, ("total requested sending data length: %d, in %d segs,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5269
	    " max seg len: %d\n", total_len, frags, max_seg_len));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5270
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5271
	/* claim a free slot in tx ring */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5272
	tx_cb = &tx_ring->wq_desc[tx_ring->prod_idx];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5273
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5274
	/* get the tx descriptor */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5275
	mac_iocb_ptr = tx_cb->queue_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5276
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5277
	bzero((void *)mac_iocb_ptr, 20);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5278
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5279
	ASSERT(tx_cb->mp == NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5280
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5281
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5282
	 * Decide to use DMA map or copy mode.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5283
	 * DMA map mode must be used when the total msg length is more than the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5284
	 * tx buffer length.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5285
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5286
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5287
	if (total_len > tx_buf_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5288
		tx_mode = USE_DMA;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5289
	else if	(max_seg_len > QL_MAX_COPY_LENGTH)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5290
		tx_mode = USE_DMA;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5291
	else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5292
		tx_mode = USE_COPY;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5293
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5294
	if (qlge->chksum_cap) {
11878
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  5295
		mac_hcksum_get(mp, NULL, NULL, NULL, NULL, &pflags);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5296
		QL_PRINT(DBG_TX, ("checksum flag is :0x%x, card capability "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5297
		    "is 0x%x \n", pflags, qlge->chksum_cap));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5298
		if (qlge->lso_enable) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5299
			uint32_t lso_flags = 0;
11878
ac93462db6d7 PSARC/2009/364 dlstat and flowstat
Venugopal Iyer <Venu.Iyer@Sun.COM>
parents: 11016
diff changeset
  5300
			mac_lso_get(mp, &mss, &lso_flags);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5301
			use_lso = (lso_flags == HW_LSO);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5302
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5303
		QL_PRINT(DBG_TX, ("mss :%d, use_lso %x \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5304
		    mss, use_lso));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5305
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5306
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5307
do_pullup:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5308
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5309
	/* concatenate all frags into one large packet if too fragmented */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5310
	if (((tx_mode == USE_DMA)&&(frags > QL_MAX_TX_DMA_HANDLES)) ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5311
	    force_pullup) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5312
		mblk_t *mp1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5313
		if ((mp1 = msgpullup(mp, -1)) != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5314
			freemsg(mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5315
			mp = mp1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5316
			frags = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5317
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5318
			tx_ring->tx_fail_dma_bind++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5319
			goto bad;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5320
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5321
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5322
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5323
	tx_cb->tx_bytes = (uint32_t)total_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5324
	tx_cb->mp = mp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5325
	tx_cb->tx_dma_handle_used = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5326
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5327
	if (tx_mode == USE_DMA) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5328
		msg_len = total_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5329
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5330
		mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5331
		mac_iocb_ptr->tid = tx_ring->prod_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5332
		mac_iocb_ptr->frame_len = (uint32_t)cpu_to_le32(msg_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5333
		mac_iocb_ptr->txq_idx = tx_ring->wq_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5334
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5335
		tx_entry = &mac_iocb_ptr->oal_entry[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5336
		oal_entry = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5337
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5338
		for (tp = mp, oal_entries = j = 0; tp != NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5339
		    tp = tp->b_cont) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5340
			/* if too many tx dma handles needed */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5341
			if (j >= QL_MAX_TX_DMA_HANDLES) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5342
				tx_ring->tx_no_dma_handle++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5343
				if (!force_pullup) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5344
					force_pullup = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5345
					goto do_pullup;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5346
				} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5347
					goto bad;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5348
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5349
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5350
			nbyte = (uint16_t)MBLKL(tp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5351
			if (nbyte == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5352
				continue;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5353
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5354
			status = ddi_dma_addr_bind_handle(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5355
			    tx_cb->tx_dma_handle[j], NULL,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5356
			    (caddr_t)tp->b_rptr, nbyte,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5357
			    DDI_DMA_WRITE | DDI_DMA_STREAMING, DDI_DMA_DONTWAIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5358
			    0, &dma_cookie, &ncookies);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5359
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5360
			QL_PRINT(DBG_TX, ("map sending data segment: %d, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5361
			    "length: %d, spans in %d cookies\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5362
			    j, nbyte, ncookies));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5363
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5364
			if (status != DDI_DMA_MAPPED) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5365
				goto bad;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5366
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5367
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5368
			 * Each fragment can span several cookies. One cookie
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5369
			 * will use one tx descriptor to transmit.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5370
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5371
			for (i = ncookies; i > 0; i--, tx_entry++,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5372
			    oal_entries++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5373
				/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5374
				 * The number of TX descriptors that can be
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5375
				 *  saved in tx iocb and oal list is limited
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5376
				 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5377
				if (oal_entries > max_oal_entries) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5378
					tx_ring->tx_no_dma_cookie++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5379
					if (!force_pullup) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5380
						force_pullup = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5381
						goto do_pullup;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5382
					} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5383
						goto bad;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5384
					}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5385
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5386
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5387
				if ((oal_entries == TX_DESC_PER_IOCB) &&
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5388
				    !oal_entry) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5389
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5390
					 * Time to switch to an oal list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5391
					 * The last entry should be copied
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5392
					 * to first entry in the oal list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5393
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5394
					oal_entry = tx_cb->oal;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5395
					tx_entry =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5396
					    &mac_iocb_ptr->oal_entry[
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5397
					    TX_DESC_PER_IOCB-1];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5398
					bcopy(tx_entry, oal_entry,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5399
					    sizeof (*oal_entry));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5400
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5401
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5402
					 * last entry should be updated to
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5403
					 * point to the extended oal list itself
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5404
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5405
					tx_entry->buf_addr_low =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5406
					    cpu_to_le32(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5407
					    LS_64BITS(tx_cb->oal_dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5408
					tx_entry->buf_addr_high =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5409
					    cpu_to_le32(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5410
					    MS_64BITS(tx_cb->oal_dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5411
					/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5412
					 * Point tx_entry to the oal list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5413
					 * second entry
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5414
					 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5415
					tx_entry = &oal_entry[1];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5416
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5417
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5418
				tx_entry->buf_len =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5419
				    (uint32_t)cpu_to_le32(dma_cookie.dmac_size);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5420
				phys_addr = dma_cookie.dmac_laddress;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5421
				tx_entry->buf_addr_low =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5422
				    cpu_to_le32(LS_64BITS(phys_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5423
				tx_entry->buf_addr_high =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5424
				    cpu_to_le32(MS_64BITS(phys_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5425
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5426
				last_oal_entry = tx_entry;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5427
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5428
				if (i > 1)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5429
					ddi_dma_nextcookie(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5430
					    tx_cb->tx_dma_handle[j],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5431
					    &dma_cookie);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5432
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5433
			j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5434
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5435
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5436
		 * if OAL is used, the last oal entry in tx iocb indicates
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5437
		 * number of additional address/len pairs in OAL
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5438
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5439
		if (oal_entries > TX_DESC_PER_IOCB) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5440
			tx_entry = &mac_iocb_ptr->oal_entry[TX_DESC_PER_IOCB-1];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5441
			tx_entry->buf_len = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5442
			    (cpu_to_le32((sizeof (struct oal_entry) *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5443
			    (oal_entries -TX_DESC_PER_IOCB+1))|OAL_CONT_ENTRY));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5444
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5445
		last_oal_entry->buf_len = cpu_to_le32(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5446
		    le32_to_cpu(last_oal_entry->buf_len)|OAL_LAST_ENTRY);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5447
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5448
		tx_cb->tx_dma_handle_used = j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5449
		QL_PRINT(DBG_TX, ("total tx_dma_handle_used %d cookies %d \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5450
		    j, oal_entries));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5451
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5452
		bp = (caddr_t)mp->b_rptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5453
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5454
	if (tx_mode == USE_COPY) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5455
		bp = tx_cb->copy_buffer;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5456
		off = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5457
		nbyte = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5458
		frags = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5459
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5460
		 * Copy up to tx_buf_len of the transmit data
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5461
		 * from mp to tx buffer
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5462
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5463
		for (tp = mp; tp != NULL; tp = tp->b_cont) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5464
			nbyte = MBLKL(tp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5465
			if ((off + nbyte) <= tx_buf_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5466
				bcopy(tp->b_rptr, &bp[off], nbyte);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5467
				off += nbyte;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5468
				frags ++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5469
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5470
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5471
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5472
		msg_len = off;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5473
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5474
		mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5475
		mac_iocb_ptr->tid = tx_ring->prod_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5476
		mac_iocb_ptr->frame_len = (uint32_t)cpu_to_le32(msg_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5477
		mac_iocb_ptr->txq_idx = tx_ring->wq_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5478
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5479
		QL_PRINT(DBG_TX, ("Copy Mode:actual sent data length is: %d, "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5480
		    "from %d segaments\n", msg_len, frags));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5481
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5482
		phys_addr = tx_cb->copy_buffer_dma_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5483
		phy_addr_low = cpu_to_le32(LS_64BITS(phys_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5484
		phy_addr_high = cpu_to_le32(MS_64BITS(phys_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5485
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5486
		QL_DUMP(DBG_TX, "\t requested sending data:\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5487
		    (uint8_t *)tx_cb->copy_buffer, 8, total_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5488
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5489
		mac_iocb_ptr->oal_entry[0].buf_len = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5490
		    cpu_to_le32(msg_len | OAL_LAST_ENTRY);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5491
		mac_iocb_ptr->oal_entry[0].buf_addr_low  = phy_addr_low;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5492
		mac_iocb_ptr->oal_entry[0].buf_addr_high = phy_addr_high;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5493
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5494
		freemsg(mp); /* no need, we have copied */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5495
		tx_cb->mp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5496
	} /* End of Copy Mode */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5497
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5498
	/* Do TSO/LSO on TCP packet? */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5499
	if (use_lso && mss) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5500
		ql_hw_lso_setup(qlge, mss, bp, mac_iocb_ptr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5501
	} else if (pflags & qlge->chksum_cap) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5502
		/* Do checksum offloading */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5503
		ql_hw_csum_setup(qlge, pflags, bp, mac_iocb_ptr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5504
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5505
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5506
	/* let device know the latest outbound IOCB */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5507
	(void) ddi_dma_sync(tx_ring->wq_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5508
	    (off_t)((uintptr_t)mac_iocb_ptr - (uintptr_t)tx_ring->wq_dma.vaddr),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5509
	    (size_t)sizeof (*mac_iocb_ptr), DDI_DMA_SYNC_FORDEV);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5510
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5511
	if (tx_mode == USE_DMA) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5512
		/* let device know the latest outbound OAL if necessary */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5513
		if (oal_entries > TX_DESC_PER_IOCB) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5514
			(void) ddi_dma_sync(tx_cb->oal_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5515
			    (off_t)0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5516
			    (sizeof (struct oal_entry) *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5517
			    (oal_entries -TX_DESC_PER_IOCB+1)),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5518
			    DDI_DMA_SYNC_FORDEV);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5519
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5520
	} else { /* for USE_COPY mode, tx buffer has changed */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5521
		/* let device know the latest change */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5522
		(void) ddi_dma_sync(tx_cb->oal_dma.dma_handle,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5523
		/* copy buf offset */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5524
		    (off_t)(sizeof (oal_entry) * MAX_SG_ELEMENTS),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5525
		    msg_len, DDI_DMA_SYNC_FORDEV);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5526
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5527
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5528
	/* save how the packet was sent */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5529
	tx_cb->tx_type = tx_mode;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5530
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5531
	QL_DUMP_REQ_PKT(qlge, mac_iocb_ptr, tx_cb->oal, oal_entries);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5532
	/* reduce the number of available tx slot */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5533
	atomic_dec_32(&tx_ring->tx_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5534
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5535
	tx_ring->prod_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5536
	if (tx_ring->prod_idx >= tx_ring->wq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5537
		tx_ring->prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5538
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5539
	now = ddi_get_lbolt();
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5540
	qlge->last_tx_time = now;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5541
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5542
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5543
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5544
bad:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5545
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5546
	 * if for any reason driver can not send, delete
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5547
	 * the message pointer, mp
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5548
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5549
	now = ddi_get_lbolt();
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5550
	freemsg(mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5551
	mp = NULL;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5552
	tx_cb->mp = NULL;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5553
	for (i = 0; i < j; i++)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5554
		(void) ddi_dma_unbind_handle(tx_cb->tx_dma_handle[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5555
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5556
	QL_PRINT(DBG_TX, ("%s(%d) failed at 0x%x",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5557
	    __func__, qlge->instance, (int)now));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5558
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5559
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5560
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5561
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5562
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5563
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5564
 * Initializes hardware and driver software flags before the driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5565
 * is finally ready to work.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5566
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5567
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5568
ql_do_start(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5569
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5570
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5571
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5572
	uint16_t lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5573
	int rings_done;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5574
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5575
	ASSERT(qlge != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5576
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5577
	mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5578
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5579
	/* Reset adapter */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  5580
	(void) ql_asic_reset(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5581
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5582
	lbq_buf_size = (uint16_t)
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5583
	    ((qlge->mtu == ETHERMTU)? LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5584
	if (qlge->rx_ring[0].lbq_buf_size != lbq_buf_size) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5585
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5586
		cmn_err(CE_NOTE, "realloc buffers old: %d new: %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5587
		    qlge->rx_ring[0].lbq_buf_size, lbq_buf_size);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5588
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5589
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5590
		 * Check if any ring has buffers still with upper layers
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5591
		 * If buffers are pending with upper layers, we use the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5592
		 * existing buffers and don't reallocate new ones
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5593
		 * Unfortunately there is no way to evict buffers from
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5594
		 * upper layers. Using buffers with the current size may
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5595
		 * cause slightly sub-optimal performance, but that seems
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5596
		 * to be the easiest way to handle this situation.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5597
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5598
		rings_done = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5599
		for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5600
			rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5601
			if (rx_ring->rx_indicate == 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5602
				rings_done++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5603
			else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5604
				break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5605
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5606
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5607
		 * No buffers pending with upper layers;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5608
		 * reallocte them for new MTU size
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5609
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5610
		if (rings_done >= qlge->rx_ring_count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5611
			/* free large buffer pool */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5612
			for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5613
				rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5614
				if (rx_ring->type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5615
					ql_free_sbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5616
					ql_free_lbq_buffers(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5617
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5618
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5619
			/* reallocate large buffer pool */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5620
			for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5621
				rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5622
				if (rx_ring->type != TX_Q) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  5623
					(void) ql_alloc_sbufs(qlge, rx_ring);
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  5624
					(void) ql_alloc_lbufs(qlge, rx_ring);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5625
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5626
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5627
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5628
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5629
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5630
	if (ql_bringup_adapter(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5631
		cmn_err(CE_WARN, "qlge bringup adapter failed");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5632
		mutex_exit(&qlge->hw_mutex);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5633
		if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5634
			atomic_or_32(&qlge->flags, ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5635
			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5636
		}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5637
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5638
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5639
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5640
	mutex_exit(&qlge->hw_mutex);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5641
	/* if adapter is up successfully but was bad before */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5642
	if (qlge->flags & ADAPTER_ERROR) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5643
		atomic_and_32(&qlge->flags, ~ADAPTER_ERROR);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5644
		if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5645
			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_RESTORED);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5646
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  5647
	}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5648
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5649
	/* Get current link state */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5650
	qlge->port_link_state = ql_get_link_state(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5651
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5652
	if (qlge->port_link_state == LS_UP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5653
		QL_PRINT(DBG_GLD, ("%s(%d) Link UP !!\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5654
		    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5655
		/* If driver detects a carrier on */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5656
		CARRIER_ON(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5657
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5658
		QL_PRINT(DBG_GLD, ("%s(%d) Link down\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5659
		    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5660
		/* If driver detects a lack of carrier */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5661
		CARRIER_OFF(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5662
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5663
	qlge->mac_flags = QL_MAC_STARTED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5664
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5665
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5666
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5667
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5668
 * Stop currently running driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5669
 * Driver needs to stop routing new packets to driver and wait until
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5670
 * all pending tx/rx buffers to be free-ed.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5671
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5672
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5673
ql_do_stop(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5674
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5675
	int rc = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5676
	uint32_t i, j, k;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5677
	struct bq_desc *sbq_desc, *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5678
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5679
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5680
	ASSERT(qlge != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5681
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5682
	CARRIER_OFF(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5683
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5684
	rc = ql_bringdown_adapter(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5685
	if (rc != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5686
		cmn_err(CE_WARN, "qlge bringdown adapter failed.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5687
	} else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5688
		rc = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5689
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5690
	for (k = 0; k < qlge->rx_ring_count; k++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5691
		rx_ring = &qlge->rx_ring[k];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5692
		if (rx_ring->type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5693
			j = rx_ring->lbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5694
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5695
			cmn_err(CE_NOTE, "ring %d: move %d lbufs in use list"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5696
			    " to free list %d\n total %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5697
			    k, rx_ring->lbuf_in_use_count,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5698
			    rx_ring->lbuf_free_count,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5699
			    rx_ring->lbuf_in_use_count +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5700
			    rx_ring->lbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5701
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5702
			for (i = 0; i < rx_ring->lbuf_in_use_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5703
				lbq_desc = rx_ring->lbuf_in_use[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5704
				j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5705
				if (j >= rx_ring->lbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5706
					j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5707
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5708
				if (lbq_desc->mp) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5709
					atomic_inc_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5710
					freemsg(lbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5711
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5712
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5713
			rx_ring->lbq_use_head = j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5714
			rx_ring->lbq_use_tail = j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5715
			rx_ring->lbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5716
			j = rx_ring->sbq_use_head;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5717
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5718
			cmn_err(CE_NOTE, "ring %d: move %d sbufs in use list,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5719
			    " to free list %d\n total %d \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5720
			    k, rx_ring->sbuf_in_use_count,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5721
			    rx_ring->sbuf_free_count,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5722
			    rx_ring->sbuf_in_use_count +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5723
			    rx_ring->sbuf_free_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5724
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5725
			for (i = 0; i < rx_ring->sbuf_in_use_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5726
				sbq_desc = rx_ring->sbuf_in_use[j];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5727
				j++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5728
				if (j >= rx_ring->sbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5729
					j = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5730
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5731
				if (sbq_desc->mp) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5732
					atomic_inc_32(&rx_ring->rx_indicate);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5733
					freemsg(sbq_desc->mp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5734
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5735
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5736
			rx_ring->sbq_use_head = j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5737
			rx_ring->sbq_use_tail = j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5738
			rx_ring->sbuf_in_use_count = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5739
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5740
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5741
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5742
	qlge->mac_flags = QL_MAC_STOPPED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5743
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5744
	return (rc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5745
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5746
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5747
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5748
 * Support
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5749
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5750
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5751
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5752
ql_disable_isr(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5753
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5754
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5755
	 * disable the hardware interrupt
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5756
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5757
	ISP_DISABLE_GLOBAL_INTRS(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5758
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5759
	qlge->flags &= ~INTERRUPTS_ENABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5760
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5761
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5762
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5763
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5764
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5765
 * busy wait for 'usecs' microseconds.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5766
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5767
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5768
qlge_delay(clock_t usecs)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5769
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5770
	drv_usecwait(usecs);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5771
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5772
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5773
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5774
 * retrieve firmware details.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5775
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5776
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5777
pci_cfg_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5778
ql_get_pci_config(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5779
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5780
	return (&(qlge->pci_cfg));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5781
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5782
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5783
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5784
 * Get current Link status
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5785
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5786
static uint32_t
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5787
ql_get_link_state(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5788
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5789
	uint32_t bitToCheck = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5790
	uint32_t temp, linkState;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5791
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5792
	if (qlge->func_number == qlge->fn0_net) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5793
		bitToCheck = STS_PL0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5794
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5795
		bitToCheck = STS_PL1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5796
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5797
	temp = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5798
	QL_PRINT(DBG_GLD, ("%s(%d) chip status reg: 0x%x\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5799
	    __func__, qlge->instance, temp));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5800
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5801
	if (temp & bitToCheck) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5802
		linkState = LS_UP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5803
	} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5804
		linkState = LS_DOWN;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5805
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5806
	if (CFG_IST(qlge, CFG_CHIP_8100)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5807
		/* for Schultz, link Speed is fixed to 10G, full duplex */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5808
		qlge->speed  = SPEED_10G;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5809
		qlge->duplex = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5810
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5811
	return (linkState);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5812
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5813
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5814
 * Get current link status and report to OS
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5815
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5816
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5817
ql_get_and_report_link_state(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5818
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5819
	uint32_t cur_link_state;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5820
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5821
	/* Get current link state */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5822
	cur_link_state = ql_get_link_state(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5823
	/* if link state has changed */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5824
	if (cur_link_state != qlge->port_link_state) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5825
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5826
		qlge->port_link_state = cur_link_state;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5827
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5828
		if (qlge->port_link_state == LS_UP) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5829
			QL_PRINT(DBG_GLD, ("%s(%d) Link UP !!\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5830
			    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5831
			/* If driver detects a carrier on */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5832
			CARRIER_ON(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5833
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5834
			QL_PRINT(DBG_GLD, ("%s(%d) Link down\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5835
			    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5836
			/* If driver detects a lack of carrier */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5837
			CARRIER_OFF(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5838
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5839
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5840
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5841
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5842
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5843
 * timer callback function executed after timer expires
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5844
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5845
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5846
ql_timer(void* arg)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5847
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5848
	ql_get_and_report_link_state((qlge_t *)arg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5849
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5850
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5851
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5852
 * stop the running timer if activated
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5853
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5854
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5855
ql_stop_timer(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5856
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5857
	timeout_id_t timer_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5858
	/* Disable driver timer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5859
	if (qlge->ql_timer_timeout_id != NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5860
		timer_id = qlge->ql_timer_timeout_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5861
		qlge->ql_timer_timeout_id = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5862
		(void) untimeout(timer_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5863
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5864
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5865
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5866
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5867
 * stop then restart timer
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5868
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5869
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5870
ql_restart_timer(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5871
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5872
	ql_stop_timer(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5873
	qlge->ql_timer_ticks = TICKS_PER_SEC / 4;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5874
	qlge->ql_timer_timeout_id = timeout(ql_timer,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5875
	    (void *)qlge, qlge->ql_timer_ticks);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5876
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5877
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5878
/* ************************************************************************* */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5879
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5880
 *		Hardware K-Stats Data Structures and Subroutines
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5881
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5882
/* ************************************************************************* */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5883
static const ql_ksindex_t ql_kstats_hw[] = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5884
	/* PCI related hardware information */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5885
	{ 0, "Vendor Id"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5886
	{ 1, "Device Id"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5887
	{ 2, "Command"				},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5888
	{ 3, "Status"				},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5889
	{ 4, "Revision Id"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5890
	{ 5, "Cache Line Size"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5891
	{ 6, "Latency Timer"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5892
	{ 7, "Header Type"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5893
	{ 9, "I/O base addr"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5894
	{ 10, "Control Reg Base addr low"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5895
	{ 11, "Control Reg Base addr high"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5896
	{ 12, "Doorbell Reg Base addr low"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5897
	{ 13, "Doorbell Reg Base addr high"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5898
	{ 14, "Subsystem Vendor Id"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5899
	{ 15, "Subsystem Device ID"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5900
	{ 16, "PCIe Device Control"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5901
	{ 17, "PCIe Link Status"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5902
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5903
	{ -1,	NULL				},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5904
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5905
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5906
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5907
 * kstat update function for PCI registers
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5908
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5909
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5910
ql_kstats_get_pci_regs(kstat_t *ksp, int flag)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5911
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5912
	qlge_t *qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5913
	kstat_named_t *knp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5914
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5915
	if (flag != KSTAT_READ)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5916
		return (EACCES);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5917
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5918
	qlge = ksp->ks_private;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5919
	knp = ksp->ks_data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5920
	(knp++)->value.ui32 = qlge->pci_cfg.vendor_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5921
	(knp++)->value.ui32 = qlge->pci_cfg.device_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5922
	(knp++)->value.ui32 = qlge->pci_cfg.command;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5923
	(knp++)->value.ui32 = qlge->pci_cfg.status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5924
	(knp++)->value.ui32 = qlge->pci_cfg.revision;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5925
	(knp++)->value.ui32 = qlge->pci_cfg.cache_line_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5926
	(knp++)->value.ui32 = qlge->pci_cfg.latency_timer;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5927
	(knp++)->value.ui32 = qlge->pci_cfg.header_type;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5928
	(knp++)->value.ui32 = qlge->pci_cfg.io_base_address;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5929
	(knp++)->value.ui32 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5930
	    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_lower;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5931
	(knp++)->value.ui32 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5932
	    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_upper;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5933
	(knp++)->value.ui32 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5934
	    qlge->pci_cfg.pci_doorbell_mem_base_address_lower;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5935
	(knp++)->value.ui32 =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5936
	    qlge->pci_cfg.pci_doorbell_mem_base_address_upper;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5937
	(knp++)->value.ui32 = qlge->pci_cfg.sub_vendor_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5938
	(knp++)->value.ui32 = qlge->pci_cfg.sub_device_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5939
	(knp++)->value.ui32 = qlge->pci_cfg.pcie_device_control;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5940
	(knp++)->value.ui32 = qlge->pci_cfg.link_status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5941
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5942
	return (0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5943
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5944
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5945
static const ql_ksindex_t ql_kstats_mii[] = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5946
	/* MAC/MII related hardware information */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5947
	{ 0, "mtu"},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5948
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5949
	{ -1, NULL},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5950
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5951
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5952
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5953
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5954
 * kstat update function for MII related information.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5955
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5956
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5957
ql_kstats_mii_update(kstat_t *ksp, int flag)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5958
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5959
	qlge_t *qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5960
	kstat_named_t *knp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5961
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5962
	if (flag != KSTAT_READ)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5963
		return (EACCES);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5964
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5965
	qlge = ksp->ks_private;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5966
	knp = ksp->ks_data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5967
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5968
	(knp++)->value.ui32 = qlge->mtu;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5969
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5970
	return (0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5971
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5972
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5973
static const ql_ksindex_t ql_kstats_reg[] = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5974
	/* Register information */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5975
	{ 0, "System (0x08)"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5976
	{ 1, "Reset/Fail Over(0x0Ch"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5977
	{ 2, "Function Specific Control(0x10)"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5978
	{ 3, "Status (0x30)"			},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5979
	{ 4, "Intr Enable (0x34)"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5980
	{ 5, "Intr Status1 (0x3C)"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5981
	{ 6, "Error Status (0x54)"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5982
	{ 7, "XGMAC Flow Control(0x11C)"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5983
	{ 8, "XGMAC Tx Pause Frames(0x230)"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5984
	{ 9, "XGMAC Rx Pause Frames(0x388)"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5985
	{ 10, "XGMAC Rx FIFO Drop Count(0x5B8)"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5986
	{ 11, "interrupts actually allocated"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5987
	{ 12, "interrupts on rx ring 0"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5988
	{ 13, "interrupts on rx ring 1"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5989
	{ 14, "interrupts on rx ring 2"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5990
	{ 15, "interrupts on rx ring 3"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5991
	{ 16, "interrupts on rx ring 4"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5992
	{ 17, "interrupts on rx ring 5"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5993
	{ 18, "interrupts on rx ring 6"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5994
	{ 19, "interrupts on rx ring 7"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5995
	{ 20, "polls on rx ring 0"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5996
	{ 21, "polls on rx ring 1"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5997
	{ 22, "polls on rx ring 2"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5998
	{ 23, "polls on rx ring 3"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  5999
	{ 24, "polls on rx ring 4"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6000
	{ 25, "polls on rx ring 5"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6001
	{ 26, "polls on rx ring 6"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6002
	{ 27, "polls on rx ring 7"		},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6003
	{ 28, "tx no resource on ring 0"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6004
	{ 29, "tx dma bind fail on ring 0"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6005
	{ 30, "tx dma no handle on ring 0"	},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6006
	{ 31, "tx dma no cookie on ring 0"	},
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6007
	{ 32, "MPI firmware major version"	},
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6008
	{ 33, "MPI firmware minor version"	},
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6009
	{ 34, "MPI firmware sub version"	},
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6010
	{ 35, "rx no resource"			},
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6011
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6012
	{ -1, NULL},
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6013
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6014
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6015
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6016
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6017
 * kstat update function for device register set
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6018
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6019
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6020
ql_kstats_get_reg_and_dev_stats(kstat_t *ksp, int flag)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6021
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6022
	qlge_t *qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6023
	kstat_named_t *knp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6024
	uint32_t val32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6025
	int i = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6026
	struct tx_ring *tx_ring;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6027
	struct rx_ring *rx_ring;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6028
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6029
	if (flag != KSTAT_READ)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6030
		return (EACCES);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6031
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6032
	qlge = ksp->ks_private;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6033
	knp = ksp->ks_data;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6034
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6035
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_SYSTEM);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6036
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_RESET_FAILOVER);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6037
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_FUNCTION_SPECIFIC_CONTROL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6038
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6039
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_INTERRUPT_ENABLE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6040
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_INTERRUPT_STATUS_1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6041
	(knp++)->value.ui32 = ql_read_reg(qlge, REG_ERROR_STATUS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6042
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6043
	if (ql_sem_spinlock(qlge, qlge->xgmac_sem_mask)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6044
		return (0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6045
	}
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  6046
	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_FLOW_CONTROL, &val32);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6047
	(knp++)->value.ui32 = val32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6048
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  6049
	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_TX_PAUSE_PKTS, &val32);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6050
	(knp++)->value.ui32 = val32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6051
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  6052
	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_PAUSE_PKTS, &val32);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6053
	(knp++)->value.ui32 = val32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6054
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  6055
	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_FIFO_DROPS, &val32);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6056
	(knp++)->value.ui32 = val32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6057
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6058
	ql_sem_unlock(qlge, qlge->xgmac_sem_mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6059
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6060
	(knp++)->value.ui32 = qlge->intr_cnt;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6061
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6062
	for (i = 0; i < 8; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6063
		(knp++)->value.ui32 = qlge->rx_interrupts[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6064
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6065
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6066
	for (i = 0; i < 8; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6067
		(knp++)->value.ui32 = qlge->rx_polls[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6068
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6069
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6070
	tx_ring = &qlge->tx_ring[0];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6071
	(knp++)->value.ui32 = tx_ring->defer;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6072
	(knp++)->value.ui32 = tx_ring->tx_fail_dma_bind;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6073
	(knp++)->value.ui32 = tx_ring->tx_no_dma_handle;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6074
	(knp++)->value.ui32 = tx_ring->tx_no_dma_cookie;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6075
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6076
	(knp++)->value.ui32 = qlge->fw_version_info.major_version;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6077
	(knp++)->value.ui32 = qlge->fw_version_info.minor_version;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6078
	(knp++)->value.ui32 = qlge->fw_version_info.sub_minor_version;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6079
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6080
	for (i = 0; i < qlge->rx_ring_count; i++) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6081
		rx_ring = &qlge->rx_ring[i];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6082
		val32 += rx_ring->rx_packets_dropped_no_buffer;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6083
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6084
	(knp++)->value.ui32 = val32;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6085
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6086
	return (0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6087
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6088
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6089
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6090
static kstat_t *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6091
ql_setup_named_kstat(qlge_t *qlge, int instance, char *name,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6092
    const ql_ksindex_t *ksip, size_t size, int (*update)(kstat_t *, int))
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6093
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6094
	kstat_t *ksp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6095
	kstat_named_t *knp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6096
	char *np;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6097
	int type;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6098
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6099
	size /= sizeof (ql_ksindex_t);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6100
	ksp = kstat_create(ADAPTER_NAME, instance, name, "net",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6101
	    KSTAT_TYPE_NAMED, ((uint32_t)size) - 1, KSTAT_FLAG_PERSISTENT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6102
	if (ksp == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6103
		return (NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6104
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6105
	ksp->ks_private = qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6106
	ksp->ks_update = update;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6107
	for (knp = ksp->ks_data; (np = ksip->name) != NULL; ++knp, ++ksip) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6108
		switch (*np) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6109
		default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6110
			type = KSTAT_DATA_UINT32;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6111
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6112
		case '&':
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6113
			np += 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6114
			type = KSTAT_DATA_CHAR;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6115
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6116
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6117
		kstat_named_init(knp, np, (uint8_t)type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6118
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6119
	kstat_install(ksp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6120
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6121
	return (ksp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6122
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6123
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6124
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6125
 * Setup various kstat
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6126
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6127
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6128
ql_init_kstats(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6129
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6130
	/* Hardware KStats */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6131
	qlge->ql_kstats[QL_KSTAT_CHIP] = ql_setup_named_kstat(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6132
	    qlge->instance, "chip", ql_kstats_hw,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6133
	    sizeof (ql_kstats_hw), ql_kstats_get_pci_regs);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6134
	if (qlge->ql_kstats[QL_KSTAT_CHIP] == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6135
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6136
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6137
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6138
	/* MII KStats */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6139
	qlge->ql_kstats[QL_KSTAT_LINK] = ql_setup_named_kstat(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6140
	    qlge->instance, "mii", ql_kstats_mii,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6141
	    sizeof (ql_kstats_mii), ql_kstats_mii_update);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6142
	if (qlge->ql_kstats[QL_KSTAT_LINK] == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6143
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6144
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6145
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6146
	/* REG KStats */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6147
	qlge->ql_kstats[QL_KSTAT_REG] = ql_setup_named_kstat(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6148
	    qlge->instance, "reg", ql_kstats_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6149
	    sizeof (ql_kstats_reg), ql_kstats_get_reg_and_dev_stats);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6150
	if (qlge->ql_kstats[QL_KSTAT_REG] == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6151
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6152
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6153
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6154
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6155
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6156
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6157
 * delete all kstat
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6158
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6159
void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6160
ql_fini_kstats(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6161
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6162
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6163
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6164
	for (i = 0; i < QL_KSTAT_COUNT; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6165
		if (qlge->ql_kstats[i] != NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6166
			kstat_delete(qlge->ql_kstats[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6167
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6168
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6169
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6170
/* ************************************************************************* */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6171
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6172
 *                                 kstat end
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6173
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6174
/* ************************************************************************* */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6175
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6176
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6177
 * Setup the parameters for receive and transmit rings including buffer sizes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6178
 * and completion queue sizes
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6179
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6180
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6181
ql_setup_rings(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6182
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6183
	uint8_t i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6184
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6185
	struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6186
	uint16_t lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6187
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6188
	lbq_buf_size = (uint16_t)
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6189
	    ((qlge->mtu == ETHERMTU)? LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6190
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6191
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6192
	 * rx_ring[0] is always the default queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6193
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6194
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6195
	 * qlge->rx_ring_count:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6196
	 * Total number of rx_rings. This includes a number
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6197
	 * of outbound completion handler rx_rings, and a
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6198
	 * number of inbound completion handler rx_rings.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6199
	 * rss is only enabled if we have more than 1 rx completion
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6200
	 * queue. If we have a single rx completion queue
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6201
	 * then all rx completions go to this queue and
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6202
	 * the last completion queue
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6203
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6204
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6205
	qlge->tx_ring_first_cq_id = qlge->rss_ring_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6206
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6207
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6208
		tx_ring = &qlge->tx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6209
		bzero((void *)tx_ring, sizeof (*tx_ring));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6210
		tx_ring->qlge = qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6211
		tx_ring->wq_id = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6212
		tx_ring->wq_len = qlge->tx_ring_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6213
		tx_ring->wq_size = (uint32_t)(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6214
		    tx_ring->wq_len * sizeof (struct ob_mac_iocb_req));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6215
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6216
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6217
		 * The completion queue ID for the tx rings start
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6218
		 * immediately after the last rss completion queue.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6219
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6220
		tx_ring->cq_id = (uint16_t)(i + qlge->tx_ring_first_cq_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6221
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6222
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6223
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6224
		rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6225
		bzero((void *)rx_ring, sizeof (*rx_ring));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6226
		rx_ring->qlge = qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6227
		rx_ring->cq_id = i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6228
		if (i != 0)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6229
			rx_ring->cpu = (i) % qlge->rx_ring_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6230
		else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6231
			rx_ring->cpu = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6232
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6233
		if (i < qlge->rss_ring_count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6234
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6235
			 * Inbound completions (RSS) queues
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6236
			 * Default queue is queue 0 which handles
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6237
			 * unicast plus bcast/mcast and async events.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6238
			 * Other inbound queues handle unicast frames only.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6239
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6240
			rx_ring->cq_len = qlge->rx_ring_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6241
			rx_ring->cq_size = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6242
			    (rx_ring->cq_len * sizeof (struct net_rsp_iocb));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6243
			rx_ring->lbq_len = NUM_LARGE_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6244
			rx_ring->lbq_size = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6245
			    (rx_ring->lbq_len * sizeof (uint64_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6246
			rx_ring->lbq_buf_size = lbq_buf_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6247
			rx_ring->sbq_len = NUM_SMALL_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6248
			rx_ring->sbq_size = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6249
			    (rx_ring->sbq_len * sizeof (uint64_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6250
			rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6251
			rx_ring->type = RX_Q;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6252
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6253
			QL_PRINT(DBG_GLD,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6254
			    ("%s(%d)Allocating rss completion queue %d "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6255
			    "on cpu %d\n", __func__, qlge->instance,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6256
			    rx_ring->cq_id, rx_ring->cpu));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6257
		} else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6258
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6259
			 * Outbound queue handles outbound completions only
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6260
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6261
			/* outbound cq is same size as tx_ring it services. */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6262
			QL_PRINT(DBG_INIT, ("rx_ring 0x%p i %d\n", rx_ring, i));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6263
			rx_ring->cq_len = qlge->tx_ring_size;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6264
			rx_ring->cq_size = (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6265
			    (rx_ring->cq_len * sizeof (struct net_rsp_iocb));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6266
			rx_ring->lbq_len = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6267
			rx_ring->lbq_size = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6268
			rx_ring->lbq_buf_size = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6269
			rx_ring->sbq_len = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6270
			rx_ring->sbq_size = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6271
			rx_ring->sbq_buf_size = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6272
			rx_ring->type = TX_Q;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6273
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6274
			QL_PRINT(DBG_GLD,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6275
			    ("%s(%d)Allocating TX completion queue %d on"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6276
			    " cpu %d\n", __func__, qlge->instance,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6277
			    rx_ring->cq_id, rx_ring->cpu));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6278
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6279
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6280
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6281
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6282
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6283
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6284
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6285
ql_start_rx_ring(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6286
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6287
	struct cqicb_t *cqicb = (struct cqicb_t *)rx_ring->cqicb_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6288
	void *shadow_reg = (uint8_t *)qlge->host_copy_shadow_dma_attr.vaddr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6289
	    (rx_ring->cq_id * sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6290
	/* first shadow area is used by wqicb's host copy of consumer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6291
	    + sizeof (uint64_t);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6292
	uint64_t shadow_reg_dma = qlge->host_copy_shadow_dma_attr.dma_addr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6293
	    (rx_ring->cq_id * sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6294
	    + sizeof (uint64_t);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6295
	/* lrg/sml bufq pointers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6296
	uint8_t *buf_q_base_reg =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6297
	    (uint8_t *)qlge->buf_q_ptr_base_addr_dma_attr.vaddr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6298
	    (rx_ring->cq_id * sizeof (uint64_t) * BUF_Q_PTR_SPACE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6299
	uint64_t buf_q_base_reg_dma =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6300
	    qlge->buf_q_ptr_base_addr_dma_attr.dma_addr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6301
	    (rx_ring->cq_id * sizeof (uint64_t) * BUF_Q_PTR_SPACE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6302
	caddr_t doorbell_area =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6303
	    qlge->doorbell_reg_iobase + (VM_PAGE_SIZE * (128 + rx_ring->cq_id));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6304
	int err = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6305
	uint16_t bq_len;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6306
	uint64_t tmp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6307
	uint64_t *base_indirect_ptr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6308
	int page_entries;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6309
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6310
	/* Set up the shadow registers for this ring. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6311
	rx_ring->prod_idx_sh_reg = shadow_reg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6312
	rx_ring->prod_idx_sh_reg_dma = shadow_reg_dma;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6313
	rx_ring->prod_idx_sh_reg_offset = (off_t)(((rx_ring->cq_id *
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6314
	    sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE) + sizeof (uint64_t)));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6315
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6316
	rx_ring->lbq_base_indirect = (uint64_t *)(void *)buf_q_base_reg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6317
	rx_ring->lbq_base_indirect_dma = buf_q_base_reg_dma;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6318
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6319
	QL_PRINT(DBG_INIT, ("%s rx ring(%d): prod_idx virtual addr = 0x%lx,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6320
	    " phys_addr 0x%lx\n", __func__, rx_ring->cq_id,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6321
	    rx_ring->prod_idx_sh_reg, rx_ring->prod_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6322
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6323
	buf_q_base_reg += ((BUF_Q_PTR_SPACE / 2) * sizeof (uint64_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6324
	buf_q_base_reg_dma += ((BUF_Q_PTR_SPACE / 2) * sizeof (uint64_t));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6325
	rx_ring->sbq_base_indirect = (uint64_t *)(void *)buf_q_base_reg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6326
	rx_ring->sbq_base_indirect_dma = buf_q_base_reg_dma;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6327
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6328
	/* PCI doorbell mem area + 0x00 for consumer index register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6329
	rx_ring->cnsmr_idx_db_reg = (uint32_t *)(void *)doorbell_area;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6330
	rx_ring->cnsmr_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6331
	*rx_ring->prod_idx_sh_reg = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6332
	rx_ring->curr_entry = rx_ring->cq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6333
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6334
	/* PCI doorbell mem area + 0x04 for valid register */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6335
	rx_ring->valid_db_reg = (uint32_t *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6336
	    ((uint8_t *)(void *)doorbell_area + 0x04);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6337
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6338
	/* PCI doorbell mem area + 0x18 for large buffer consumer */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6339
	rx_ring->lbq_prod_idx_db_reg = (uint32_t *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6340
	    ((uint8_t *)(void *)doorbell_area + 0x18);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6341
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6342
	/* PCI doorbell mem area + 0x1c */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6343
	rx_ring->sbq_prod_idx_db_reg = (uint32_t *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6344
	    ((uint8_t *)(void *)doorbell_area + 0x1c);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6345
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6346
	bzero((void *)cqicb, sizeof (*cqicb));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6347
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6348
	cqicb->msix_vect = (uint8_t)rx_ring->irq;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6349
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6350
	bq_len = (uint16_t)((rx_ring->cq_len == 65536) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6351
	    (uint16_t)0 : (uint16_t)rx_ring->cq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6352
	cqicb->len = (uint16_t)cpu_to_le16(bq_len | LEN_V | LEN_CPP_CONT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6353
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6354
	cqicb->cq_base_addr_lo =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6355
	    cpu_to_le32(LS_64BITS(rx_ring->cq_dma.dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6356
	cqicb->cq_base_addr_hi =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6357
	    cpu_to_le32(MS_64BITS(rx_ring->cq_dma.dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6358
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6359
	cqicb->prod_idx_addr_lo =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6360
	    cpu_to_le32(LS_64BITS(rx_ring->prod_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6361
	cqicb->prod_idx_addr_hi =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6362
	    cpu_to_le32(MS_64BITS(rx_ring->prod_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6363
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6364
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6365
	 * Set up the control block load flags.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6366
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6367
	cqicb->flags = FLAGS_LC | /* Load queue base address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6368
	    FLAGS_LV | /* Load MSI-X vector */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6369
	    FLAGS_LI;  /* Load irq delay values */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6370
	if (rx_ring->lbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6371
		/* Load lbq values */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6372
		cqicb->flags = (uint8_t)(cqicb->flags | FLAGS_LL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6373
		tmp = (uint64_t)rx_ring->lbq_dma.dma_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6374
		base_indirect_ptr = (uint64_t *)rx_ring->lbq_base_indirect;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6375
		page_entries = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6376
		do {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6377
			*base_indirect_ptr = cpu_to_le64(tmp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6378
			tmp += VM_PAGE_SIZE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6379
			base_indirect_ptr++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6380
			page_entries++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6381
		} while (page_entries < (int)(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6382
		    ((rx_ring->lbq_len * sizeof (uint64_t)) / VM_PAGE_SIZE)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6383
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6384
		cqicb->lbq_addr_lo =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6385
		    cpu_to_le32(LS_64BITS(rx_ring->lbq_base_indirect_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6386
		cqicb->lbq_addr_hi =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6387
		    cpu_to_le32(MS_64BITS(rx_ring->lbq_base_indirect_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6388
		bq_len = (uint16_t)((rx_ring->lbq_buf_size == 65536) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6389
		    (uint16_t)0 : (uint16_t)rx_ring->lbq_buf_size);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6390
		cqicb->lbq_buf_size = (uint16_t)cpu_to_le16(bq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6391
		bq_len = (uint16_t)((rx_ring->lbq_len == 65536) ? (uint16_t)0 :
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6392
		    (uint16_t)rx_ring->lbq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6393
		cqicb->lbq_len = (uint16_t)cpu_to_le16(bq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6394
		rx_ring->lbq_prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6395
		rx_ring->lbq_curr_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6396
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6397
	if (rx_ring->sbq_len) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6398
		/* Load sbq values */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6399
		cqicb->flags = (uint8_t)(cqicb->flags | FLAGS_LS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6400
		tmp = (uint64_t)rx_ring->sbq_dma.dma_addr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6401
		base_indirect_ptr = (uint64_t *)rx_ring->sbq_base_indirect;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6402
		page_entries = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6403
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6404
		do {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6405
			*base_indirect_ptr = cpu_to_le64(tmp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6406
			tmp += VM_PAGE_SIZE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6407
			base_indirect_ptr++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6408
			page_entries++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6409
		} while (page_entries < (uint32_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6410
		    (((rx_ring->sbq_len * sizeof (uint64_t)) / VM_PAGE_SIZE)));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6411
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6412
		cqicb->sbq_addr_lo =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6413
		    cpu_to_le32(LS_64BITS(rx_ring->sbq_base_indirect_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6414
		cqicb->sbq_addr_hi =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6415
		    cpu_to_le32(MS_64BITS(rx_ring->sbq_base_indirect_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6416
		cqicb->sbq_buf_size = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6417
		    cpu_to_le16((uint16_t)(rx_ring->sbq_buf_size/2));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6418
		bq_len = (uint16_t)((rx_ring->sbq_len == 65536) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6419
		    (uint16_t)0 : (uint16_t)rx_ring->sbq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6420
		cqicb->sbq_len = (uint16_t)cpu_to_le16(bq_len);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6421
		rx_ring->sbq_prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6422
		rx_ring->sbq_curr_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6423
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6424
	switch (rx_ring->type) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6425
	case TX_Q:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6426
		cqicb->irq_delay = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6427
		    cpu_to_le16(qlge->tx_coalesce_usecs);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6428
		cqicb->pkt_delay = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6429
		    cpu_to_le16(qlge->tx_max_coalesced_frames);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6430
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6431
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6432
	case DEFAULT_Q:
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6433
		cqicb->irq_delay = (uint16_t)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6434
		    cpu_to_le16(qlge->rx_coalesce_usecs);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6435
		cqicb->pkt_delay = (uint16_t)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6436
		    cpu_to_le16(qlge->rx_max_coalesced_frames);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6437
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6438
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6439
	case RX_Q:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6440
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6441
		 * Inbound completion handling rx_rings run in
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6442
		 * separate NAPI contexts.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6443
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6444
		cqicb->irq_delay = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6445
		    cpu_to_le16(qlge->rx_coalesce_usecs);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6446
		cqicb->pkt_delay = (uint16_t)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6447
		    cpu_to_le16(qlge->rx_max_coalesced_frames);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6448
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6449
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6450
		cmn_err(CE_WARN, "Invalid rx_ring->type = %d.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6451
		    rx_ring->type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6452
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6453
	QL_PRINT(DBG_INIT, ("Initializing rx completion queue %d.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6454
	    rx_ring->cq_id));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6455
	/* QL_DUMP_CQICB(qlge, cqicb); */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6456
	err = ql_write_cfg(qlge, CFG_LCQ, rx_ring->cqicb_dma.dma_addr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6457
	    rx_ring->cq_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6458
	if (err) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6459
		cmn_err(CE_WARN, "Failed to load CQICB.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6460
		return (err);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6461
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6462
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6463
	rx_ring->rx_packets_dropped_no_buffer = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6464
	rx_ring->rx_pkt_dropped_mac_unenabled = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6465
	rx_ring->rx_failed_sbq_allocs = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6466
	rx_ring->rx_failed_lbq_allocs = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6467
	rx_ring->rx_packets = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6468
	rx_ring->rx_bytes = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6469
	rx_ring->frame_too_long = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6470
	rx_ring->frame_too_short = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6471
	rx_ring->fcs_err = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6472
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6473
	return (err);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6474
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6475
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6476
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6477
 * start RSS
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6478
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6479
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6480
ql_start_rss(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6481
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6482
	struct ricb *ricb = (struct ricb *)qlge->ricb_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6483
	int status = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6484
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6485
	uint8_t *hash_id = (uint8_t *)ricb->hash_cq_id;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6486
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6487
	bzero((void *)ricb, sizeof (*ricb));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6488
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6489
	ricb->base_cq = RSS_L4K;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6490
	ricb->flags =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6491
	    (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6492
	    RSS_RT6);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6493
	ricb->mask = (uint16_t)cpu_to_le16(RSS_HASH_CQ_ID_MAX - 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6494
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6495
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6496
	 * Fill out the Indirection Table.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6497
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6498
	for (i = 0; i < RSS_HASH_CQ_ID_MAX; i++)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6499
		hash_id[i] = (uint8_t)(i & (qlge->rss_ring_count - 1));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6500
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6501
	(void) memcpy(&ricb->ipv6_hash_key[0], key_data, 40);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6502
	(void) memcpy(&ricb->ipv4_hash_key[0], key_data, 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6503
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6504
	QL_PRINT(DBG_INIT, ("Initializing RSS.\n"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6505
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6506
	status = ql_write_cfg(qlge, CFG_LR, qlge->ricb_dma.dma_addr, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6507
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6508
		cmn_err(CE_WARN, "Failed to load RICB.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6509
		return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6510
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6511
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6512
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6513
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6514
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6515
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6516
 * load a tx ring control block to hw and start this ring
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6517
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6518
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6519
ql_start_tx_ring(qlge_t *qlge, struct tx_ring *tx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6520
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6521
	struct wqicb_t *wqicb = (struct wqicb_t *)tx_ring->wqicb_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6522
	caddr_t doorbell_area =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6523
	    qlge->doorbell_reg_iobase + (VM_PAGE_SIZE * tx_ring->wq_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6524
	void *shadow_reg = (uint8_t *)qlge->host_copy_shadow_dma_attr.vaddr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6525
	    (tx_ring->wq_id * sizeof (uint64_t)) * RX_TX_RING_SHADOW_SPACE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6526
	uint64_t shadow_reg_dma = qlge->host_copy_shadow_dma_attr.dma_addr +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6527
	    (tx_ring->wq_id * sizeof (uint64_t)) * RX_TX_RING_SHADOW_SPACE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6528
	int err = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6529
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6530
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6531
	 * Assign doorbell registers for this tx_ring.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6532
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6533
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6534
	/* TX PCI doorbell mem area for tx producer index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6535
	tx_ring->prod_idx_db_reg = (uint32_t *)(void *)doorbell_area;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6536
	tx_ring->prod_idx = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6537
	/* TX PCI doorbell mem area + 0x04 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6538
	tx_ring->valid_db_reg = (uint32_t *)(void *)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6539
	    ((uint8_t *)(void *)doorbell_area + 0x04);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6540
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6541
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6542
	 * Assign shadow registers for this tx_ring.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6543
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6544
	tx_ring->cnsmr_idx_sh_reg = shadow_reg;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6545
	tx_ring->cnsmr_idx_sh_reg_dma = shadow_reg_dma;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6546
	*tx_ring->cnsmr_idx_sh_reg = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6547
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6548
	QL_PRINT(DBG_INIT, ("%s tx ring(%d): cnsmr_idx virtual addr = 0x%lx,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6549
	    " phys_addr 0x%lx\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6550
	    __func__, tx_ring->wq_id, tx_ring->cnsmr_idx_sh_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6551
	    tx_ring->cnsmr_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6552
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6553
	wqicb->len =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6554
	    (uint16_t)cpu_to_le16(tx_ring->wq_len | Q_LEN_V | Q_LEN_CPP_CONT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6555
	wqicb->flags = cpu_to_le16(Q_FLAGS_LC |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6556
	    Q_FLAGS_LB | Q_FLAGS_LI | Q_FLAGS_LO);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6557
	wqicb->cq_id_rss = (uint16_t)cpu_to_le16(tx_ring->cq_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6558
	wqicb->rid = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6559
	wqicb->wq_addr_lo = cpu_to_le32(LS_64BITS(tx_ring->wq_dma.dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6560
	wqicb->wq_addr_hi = cpu_to_le32(MS_64BITS(tx_ring->wq_dma.dma_addr));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6561
	wqicb->cnsmr_idx_addr_lo =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6562
	    cpu_to_le32(LS_64BITS(tx_ring->cnsmr_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6563
	wqicb->cnsmr_idx_addr_hi =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6564
	    cpu_to_le32(MS_64BITS(tx_ring->cnsmr_idx_sh_reg_dma));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6565
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6566
	ql_init_tx_ring(tx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6567
	/* QL_DUMP_WQICB(qlge, wqicb); */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6568
	err = ql_write_cfg(qlge, CFG_LRQ, tx_ring->wqicb_dma.dma_addr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6569
	    tx_ring->wq_id);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6570
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6571
	if (err) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6572
		cmn_err(CE_WARN, "Failed to load WQICB.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6573
		return (err);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6574
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6575
	return (err);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6576
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6577
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6578
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6579
 * Set up a MAC, multicast or VLAN address for the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6580
 * inbound frame matching.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6581
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6582
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6583
ql_set_mac_addr_reg(qlge_t *qlge, uint8_t *addr, uint32_t type,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6584
    uint16_t index)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6585
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6586
	uint32_t offset = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6587
	int status = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6588
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6589
	switch (type) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6590
	case MAC_ADDR_TYPE_MULTI_MAC:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6591
	case MAC_ADDR_TYPE_CAM_MAC: {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6592
		uint32_t cam_output;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6593
		uint32_t upper = (addr[0] << 8) | addr[1];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6594
		uint32_t lower =
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6595
		    (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6596
		    (addr[5]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6597
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6598
		QL_PRINT(DBG_INIT, ("Adding %s ", (type ==
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6599
		    MAC_ADDR_TYPE_MULTI_MAC) ?
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6600
		    "MULTICAST" : "UNICAST"));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6601
		QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6602
		    ("addr %02x %02x %02x %02x %02x %02x at index %d in "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6603
		    "the CAM.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6604
		    addr[0], addr[1], addr[2], addr[3], addr[4],
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6605
		    addr[5], index));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6606
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6607
		status = ql_wait_reg_rdy(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6608
		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6609
		if (status)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6610
			goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6611
		/* offset 0 - lower 32 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6612
		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6613
		    (offset++) |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6614
		    (index << MAC_ADDR_IDX_SHIFT) | /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6615
		    type);	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6616
		ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA, lower);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6617
		status = ql_wait_reg_rdy(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6618
		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6619
		if (status)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6620
			goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6621
		/* offset 1 - upper 16 bits of the MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6622
		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6623
		    (offset++) |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6624
		    (index << MAC_ADDR_IDX_SHIFT) | /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6625
		    type);	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6626
		ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA, upper);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6627
		status = ql_wait_reg_rdy(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6628
		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6629
		if (status)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6630
			goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6631
		/* offset 2 - CQ ID associated with this MAC address */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6632
		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6633
		    (offset) | (index << MAC_ADDR_IDX_SHIFT) |	/* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6634
		    type);	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6635
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6636
		 * This field should also include the queue id
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6637
		 * and possibly the function id.  Right now we hardcode
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6638
		 * the route field to NIC core.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6639
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6640
		if (type == MAC_ADDR_TYPE_CAM_MAC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6641
			cam_output = (CAM_OUT_ROUTE_NIC |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6642
			    (qlge->func_number << CAM_OUT_FUNC_SHIFT) |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6643
			    (0 <<
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6644
			    CAM_OUT_CQ_ID_SHIFT));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6645
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6646
			/* route to NIC core */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6647
			ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6648
			    cam_output);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6649
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6650
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6651
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6652
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6653
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6654
		    "Address type %d not yet supported.", type);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6655
		status = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6656
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6657
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6658
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6659
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6660
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6661
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6662
 * The NIC function for this chip has 16 routing indexes.  Each one can be used
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6663
 * to route different frame types to various inbound queues.  We send broadcast
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6664
 * multicast/error frames to the default queue for slow handling,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6665
 * and CAM hit/RSS frames to the fast handling queues.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6666
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6667
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6668
ql_set_routing_reg(qlge_t *qlge, uint32_t index, uint32_t mask, int enable)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6669
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6670
	int status;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6671
	uint32_t value = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6672
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6673
	QL_PRINT(DBG_INIT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6674
	    ("%s %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s mask %s the routing reg.\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6675
	    (enable ? "Adding" : "Removing"),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6676
	    ((index == RT_IDX_ALL_ERR_SLOT) ? "MAC ERROR/ALL ERROR" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6677
	    ((index == RT_IDX_IP_CSUM_ERR_SLOT) ? "IP CSUM ERROR" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6678
	    ((index ==
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6679
	    RT_IDX_TCP_UDP_CSUM_ERR_SLOT) ? "TCP/UDP CSUM ERROR" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6680
	    ((index == RT_IDX_BCAST_SLOT) ? "BROADCAST" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6681
	    ((index == RT_IDX_MCAST_MATCH_SLOT) ? "MULTICAST MATCH" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6682
	    ((index == RT_IDX_ALLMULTI_SLOT) ? "ALL MULTICAST MATCH" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6683
	    ((index == RT_IDX_UNUSED6_SLOT) ? "UNUSED6" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6684
	    ((index == RT_IDX_UNUSED7_SLOT) ? "UNUSED7" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6685
	    ((index == RT_IDX_RSS_MATCH_SLOT) ? "RSS ALL/IPV4 MATCH" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6686
	    ((index == RT_IDX_RSS_IPV6_SLOT) ? "RSS IPV6" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6687
	    ((index == RT_IDX_RSS_TCP4_SLOT) ? "RSS TCP4" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6688
	    ((index == RT_IDX_RSS_TCP6_SLOT) ? "RSS TCP6" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6689
	    ((index == RT_IDX_CAM_HIT_SLOT) ? "CAM HIT" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6690
	    ((index == RT_IDX_UNUSED013) ? "UNUSED13" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6691
	    ((index == RT_IDX_UNUSED014) ? "UNUSED14" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6692
	    ((index == RT_IDX_PROMISCUOUS_SLOT) ? "PROMISCUOUS" : ""),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6693
	    (enable ? "to" : "from")));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6694
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6695
	switch (mask) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6696
	case RT_IDX_CAM_HIT:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6697
		value = RT_IDX_DST_CAM_Q | /* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6698
		    RT_IDX_TYPE_NICQ | /* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6699
		    (RT_IDX_CAM_HIT_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6700
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6701
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6702
	case RT_IDX_VALID: /* Promiscuous Mode frames. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6703
		value = RT_IDX_DST_DFLT_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6704
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6705
		    (RT_IDX_PROMISCUOUS_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6706
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6707
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6708
	case RT_IDX_ERR:	/* Pass up MAC,IP,TCP/UDP error frames. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6709
		value = RT_IDX_DST_DFLT_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6710
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6711
		    (RT_IDX_ALL_ERR_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6712
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6713
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6714
	case RT_IDX_BCAST:	/* Pass up Broadcast frames to default Q. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6715
		value = RT_IDX_DST_DFLT_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6716
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6717
		    (RT_IDX_BCAST_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6718
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6719
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6720
	case RT_IDX_MCAST:	/* Pass up All Multicast frames. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6721
		value = RT_IDX_DST_CAM_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6722
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6723
		    (RT_IDX_ALLMULTI_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6724
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6725
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6726
	case RT_IDX_MCAST_MATCH:	/* Pass up matched Multicast frames. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6727
		value = RT_IDX_DST_CAM_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6728
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6729
		    (RT_IDX_MCAST_MATCH_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6730
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6731
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6732
	case RT_IDX_RSS_MATCH:	/* Pass up matched RSS frames. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6733
		value = RT_IDX_DST_RSS |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6734
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6735
		    (RT_IDX_RSS_MATCH_SLOT << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6736
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6737
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6738
	case 0:	/* Clear the E-bit on an entry. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6739
		value = RT_IDX_DST_DFLT_Q |	/* dest */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6740
		    RT_IDX_TYPE_NICQ |	/* type */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6741
		    (index << RT_IDX_IDX_SHIFT); /* index */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6742
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6743
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6744
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6745
		cmn_err(CE_WARN, "Mask type %d not yet supported.",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6746
		    mask);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6747
		status = -EPERM;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6748
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6749
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6750
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6751
	if (value != 0) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6752
		status = ql_wait_reg_rdy(qlge, REG_ROUTING_INDEX, RT_IDX_MW, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6753
		if (status)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6754
			goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6755
		value |= (enable ? RT_IDX_E : 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6756
		ql_write_reg(qlge, REG_ROUTING_INDEX, value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6757
		ql_write_reg(qlge, REG_ROUTING_DATA, enable ? mask : 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6758
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6759
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6760
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6761
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6762
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6763
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6764
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6765
 * Clear all the entries in the routing table.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6766
 * Caller must get semaphore in advance.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6767
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6768
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6769
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6770
ql_stop_routing(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6771
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6772
	int status = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6773
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6774
	/* Clear all the entries in the routing table. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6775
	for (i = 0; i < 16; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6776
		status = ql_set_routing_reg(qlge, i, 0, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6777
		if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6778
			cmn_err(CE_WARN, "Stop routing failed. ");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6779
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6780
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6781
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6782
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6783
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6784
/* Initialize the frame-to-queue routing. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6785
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6786
ql_route_initialize(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6787
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6788
	int status = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6789
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6790
	status = ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6791
	if (status != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6792
		return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6793
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6794
	/* Clear all the entries in the routing table. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6795
	status = ql_stop_routing(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6796
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6797
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6798
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6799
	status = ql_set_routing_reg(qlge, RT_IDX_BCAST_SLOT, RT_IDX_BCAST, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6800
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6801
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6802
		    "Failed to init routing register for broadcast packets.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6803
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6804
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6805
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6806
	 * If we have more than one inbound queue, then turn on RSS in the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6807
	 * routing block.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6808
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6809
	if (qlge->rss_ring_count > 1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6810
		status = ql_set_routing_reg(qlge, RT_IDX_RSS_MATCH_SLOT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6811
		    RT_IDX_RSS_MATCH, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6812
		if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6813
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6814
			    "Failed to init routing register for MATCH RSS "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6815
			    "packets.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6816
			goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6817
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6818
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6819
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6820
	status = ql_set_routing_reg(qlge, RT_IDX_CAM_HIT_SLOT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6821
	    RT_IDX_CAM_HIT, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6822
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6823
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6824
		    "Failed to init routing register for CAM packets.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6825
		goto exit;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6826
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6827
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6828
	status = ql_set_routing_reg(qlge, RT_IDX_MCAST_MATCH_SLOT,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6829
	    RT_IDX_MCAST_MATCH, 1);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6830
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6831
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6832
		    "Failed to init routing register for Multicast "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6833
		    "packets.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6834
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6835
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6836
exit:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6837
	ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6838
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6839
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6840
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6841
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6842
 * Initialize hardware
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6843
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6844
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6845
ql_device_initialize(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6846
{
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6847
	uint32_t value, mask;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6848
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6849
	int status = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6850
	uint16_t pause = PAUSE_MODE_DISABLED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6851
	boolean_t update_port_config = B_FALSE;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6852
	uint32_t pause_bit_mask;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6853
	boolean_t dcbx_enable = B_FALSE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6854
	uint32_t dcbx_bit_mask = 0x10;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6855
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6856
	 * Set up the System register to halt on errors.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6857
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6858
	value = SYS_EFE | SYS_FAE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6859
	mask = value << 16;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6860
	ql_write_reg(qlge, REG_SYSTEM, mask | value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6861
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6862
	/* Set the default queue. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6863
	value = NIC_RCV_CFG_DFQ;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6864
	mask = NIC_RCV_CFG_DFQ_MASK;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6865
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6866
	ql_write_reg(qlge, REG_NIC_RECEIVE_CONFIGURATION, mask | value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6867
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6868
	/* Enable the MPI interrupt. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6869
	ql_write_reg(qlge, REG_INTERRUPT_MASK, (INTR_MASK_PI << 16)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6870
	    | INTR_MASK_PI);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6871
	/* Enable the function, set pagesize, enable error checking. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6872
	value = FSC_FE | FSC_EPC_INBOUND | FSC_EPC_OUTBOUND |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6873
	    FSC_EC | FSC_VM_PAGE_4K | FSC_DBRST_1024;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6874
	/* Set/clear header splitting. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6875
	if (CFG_IST(qlge, CFG_ENABLE_SPLIT_HEADER)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6876
		value |= FSC_SH;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6877
		ql_write_reg(qlge, REG_SPLIT_HEADER, SMALL_BUFFER_SIZE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6878
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6879
	mask = FSC_VM_PAGESIZE_MASK |
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6880
	    FSC_DBL_MASK | FSC_DBRST_MASK | (value << 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6881
	ql_write_reg(qlge, REG_FUNCTION_SPECIFIC_CONTROL, mask | value);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6882
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6883
	 * check current port max frame size, if different from OS setting,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6884
	 * then we need to change
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6885
	 */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6886
	qlge->max_frame_size =
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6887
	    (qlge->mtu == ETHERMTU)? NORMAL_FRAME_SIZE : JUMBO_FRAME_SIZE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6888
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6889
	mutex_enter(&qlge->mbx_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6890
	status = ql_get_port_cfg(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6891
	mutex_exit(&qlge->mbx_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6892
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6893
	if (status == DDI_SUCCESS) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6894
		/* if current frame size is smaller than required size */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6895
		if (qlge->port_cfg_info.max_frame_size <
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6896
		    qlge->max_frame_size) {
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6897
			QL_PRINT(DBG_MBX,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6898
			    ("update frame size, current %d, new %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6899
			    qlge->port_cfg_info.max_frame_size,
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6900
			    qlge->max_frame_size));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6901
			qlge->port_cfg_info.max_frame_size =
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6902
			    qlge->max_frame_size;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6903
			qlge->port_cfg_info.link_cfg |= ENABLE_JUMBO;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6904
			update_port_config = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6905
		}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6906
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6907
		if (qlge->port_cfg_info.link_cfg & STD_PAUSE)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6908
			pause = PAUSE_MODE_STANDARD;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6909
		else if (qlge->port_cfg_info.link_cfg & PP_PAUSE)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6910
			pause = PAUSE_MODE_PER_PRIORITY;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6911
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6912
		if (pause != qlge->pause) {
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6913
			pause_bit_mask = 0x60;	/* bit 5-6 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6914
			/* clear pause bits */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6915
			qlge->port_cfg_info.link_cfg &= ~pause_bit_mask;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6916
			if (qlge->pause == PAUSE_MODE_STANDARD)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6917
				qlge->port_cfg_info.link_cfg |= STD_PAUSE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6918
			else if (qlge->pause == PAUSE_MODE_PER_PRIORITY)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6919
				qlge->port_cfg_info.link_cfg |= PP_PAUSE;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6920
			update_port_config = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6921
		}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6922
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6923
		if (qlge->port_cfg_info.link_cfg & DCBX_ENABLE)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6924
			dcbx_enable = B_TRUE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6925
		if (dcbx_enable != qlge->dcbx_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6926
			qlge->port_cfg_info.link_cfg &= ~dcbx_bit_mask;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6927
			if (qlge->dcbx_enable)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6928
				qlge->port_cfg_info.link_cfg |= DCBX_ENABLE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6929
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6930
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6931
		update_port_config = B_TRUE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6932
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6933
		/* if need to update port configuration */
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6934
		if (update_port_config) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6935
			mutex_enter(&qlge->mbx_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6936
			(void) ql_set_mpi_port_config(qlge,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6937
			    qlge->port_cfg_info);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6938
			mutex_exit(&qlge->mbx_mutex);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6939
		}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6940
	} else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6941
		cmn_err(CE_WARN, "ql_get_port_cfg failed");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6942
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6943
	/* Start up the rx queues. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6944
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6945
		status = ql_start_rx_ring(qlge, &qlge->rx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6946
		if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6947
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6948
			    "Failed to start rx ring[%d]", i);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6949
			return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6950
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6951
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6952
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6953
	/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6954
	 * If there is more than one inbound completion queue
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6955
	 * then download a RICB to configure RSS.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6956
	 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6957
	if (qlge->rss_ring_count > 1) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6958
		status = ql_start_rss(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6959
		if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6960
			cmn_err(CE_WARN, "Failed to start RSS.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6961
			return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6962
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6963
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6964
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6965
	/* Start up the tx queues. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6966
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6967
		status = ql_start_tx_ring(qlge, &qlge->tx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6968
		if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6969
			cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6970
			    "Failed to start tx ring[%d]", i);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6971
			return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6972
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6973
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6974
	qlge->selected_tx_ring = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6975
	/* Set the frame routing filter. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6976
	status = ql_route_initialize(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6977
	if (status) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6978
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6979
		    "Failed to init CAM/Routing tables.");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6980
		return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6981
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6982
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6983
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6984
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6985
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6986
 * Issue soft reset to chip.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6987
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6988
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6989
ql_asic_reset(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6990
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6991
	int status = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6992
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6993
	ql_write_reg(qlge, REG_RESET_FAILOVER, FUNCTION_RESET_MASK
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6994
	    |FUNCTION_RESET);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6995
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6996
	if (ql_wait_reg_bit(qlge, REG_RESET_FAILOVER, FUNCTION_RESET,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  6997
	    BIT_RESET, 0) != DDI_SUCCESS) {
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6998
		cmn_err(CE_WARN,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  6999
		    "TIMEOUT!!! errored out of resetting the chip!");
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7000
		status = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7001
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7002
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7003
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7004
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7005
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7006
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7007
 * If there are more than MIN_BUFFERS_ARM_COUNT small buffer descriptors in
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7008
 * its free list, move xMIN_BUFFERS_ARM_COUNT descriptors to its in use list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7009
 * to be used by hardware.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7010
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7011
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7012
ql_arm_sbuf(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7013
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7014
	struct bq_desc *sbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7015
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7016
	uint64_t *sbq_entry = rx_ring->sbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7017
	uint32_t arm_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7018
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7019
	if (rx_ring->sbuf_free_count > rx_ring->sbq_len-MIN_BUFFERS_ARM_COUNT)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7020
		arm_count = (rx_ring->sbq_len-MIN_BUFFERS_ARM_COUNT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7021
	else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7022
		/* Adjust to a multiple of 16 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7023
		arm_count = (rx_ring->sbuf_free_count / 16) * 16;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7024
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7025
		cmn_err(CE_NOTE, "adjust sbuf arm_count %d\n", arm_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7026
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7027
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7028
	for (i = 0; i < arm_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7029
		sbq_desc = ql_get_sbuf_from_free_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7030
		if (sbq_desc == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7031
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7032
		/* Arm asic */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7033
		*sbq_entry = cpu_to_le64(sbq_desc->bd_dma.dma_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7034
		sbq_entry++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7035
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7036
		/* link the descriptors to in_use_list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7037
		ql_add_sbuf_to_in_use_list(rx_ring, sbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7038
		rx_ring->sbq_prod_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7039
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7040
	ql_update_sbq_prod_idx(qlge, rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7041
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7042
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7043
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7044
 * If there are more than MIN_BUFFERS_ARM_COUNT large buffer descriptors in
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7045
 * its free list, move xMIN_BUFFERS_ARM_COUNT descriptors to its in use list
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7046
 * to be used by hardware.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7047
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7048
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7049
ql_arm_lbuf(qlge_t *qlge, struct rx_ring *rx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7050
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7051
	struct bq_desc *lbq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7052
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7053
	uint64_t *lbq_entry = rx_ring->lbq_dma.vaddr;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7054
	uint32_t arm_count;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7055
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7056
	if (rx_ring->lbuf_free_count > rx_ring->lbq_len-MIN_BUFFERS_ARM_COUNT)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7057
		arm_count = (rx_ring->lbq_len-MIN_BUFFERS_ARM_COUNT);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7058
	else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7059
		/* Adjust to a multiple of 16 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7060
		arm_count = (rx_ring->lbuf_free_count / 16) * 16;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7061
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7062
		cmn_err(CE_NOTE, "adjust lbuf arm_count %d\n", arm_count);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7063
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7064
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7065
	for (i = 0; i < arm_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7066
		lbq_desc = ql_get_lbuf_from_free_list(rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7067
		if (lbq_desc == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7068
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7069
		/* Arm asic */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7070
		*lbq_entry = cpu_to_le64(lbq_desc->bd_dma.dma_addr);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7071
		lbq_entry++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7072
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7073
		/* link the descriptors to in_use_list */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7074
		ql_add_lbuf_to_in_use_list(rx_ring, lbq_desc);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7075
		rx_ring->lbq_prod_idx++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7076
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7077
	ql_update_lbq_prod_idx(qlge, rx_ring);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7078
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7079
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7080
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7081
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7082
 * Initializes the adapter by configuring request and response queues,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7083
 * allocates and ARMs small and large receive buffers to the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7084
 * hardware
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7085
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7086
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7087
ql_bringup_adapter(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7088
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7089
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7090
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7091
	if (ql_device_initialize(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7092
		cmn_err(CE_WARN, "?%s(%d): ql_device_initialize failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7093
		    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7094
		goto err_bringup;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7095
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7096
	qlge->sequence |= INIT_ADAPTER_UP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7097
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7098
#ifdef QLGE_TRACK_BUFFER_USAGE
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7099
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7100
		if (qlge->rx_ring[i].type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7101
			qlge->rx_sb_low_count[i] = NUM_SMALL_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7102
			qlge->rx_lb_low_count[i] = NUM_LARGE_BUFFERS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7103
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7104
		qlge->cq_low_count[i] = NUM_RX_RING_ENTRIES;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7105
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7106
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7107
	/* Arm buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7108
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7109
		if (qlge->rx_ring[i].type != TX_Q) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7110
			ql_arm_sbuf(qlge, &qlge->rx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7111
			ql_arm_lbuf(qlge, &qlge->rx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7112
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7113
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7114
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7115
	/* Enable work/request queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7116
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7117
		if (qlge->tx_ring[i].valid_db_reg)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7118
			ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7119
			    qlge->tx_ring[i].valid_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7120
			    REQ_Q_VALID);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7121
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7122
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7123
	/* Enable completion queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7124
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7125
		if (qlge->rx_ring[i].valid_db_reg)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7126
			ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7127
			    qlge->rx_ring[i].valid_db_reg,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7128
			    RSP_Q_VALID);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7129
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7130
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7131
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7132
		mutex_enter(&qlge->tx_ring[i].tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7133
		qlge->tx_ring[i].mac_flags = QL_MAC_STARTED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7134
		mutex_exit(&qlge->tx_ring[i].tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7135
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7136
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7137
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7138
		mutex_enter(&qlge->rx_ring[i].rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7139
		qlge->rx_ring[i].mac_flags = QL_MAC_STARTED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7140
		mutex_exit(&qlge->rx_ring[i].rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7141
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7142
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7143
	/* This mutex will get re-acquired in enable_completion interrupt */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7144
	mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7145
	/* Traffic can start flowing now */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7146
	ql_enable_all_completion_interrupts(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7147
	mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7148
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7149
	ql_enable_global_interrupt(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7150
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7151
	qlge->sequence |= ADAPTER_INIT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7152
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7153
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7154
err_bringup:
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7155
	(void) ql_asic_reset(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7156
	return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7157
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7158
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7159
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7160
 * Initialize mutexes of each rx/tx rings
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7161
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7162
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7163
ql_init_rx_tx_locks(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7164
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7165
	struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7166
	struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7167
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7168
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7169
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7170
		tx_ring = &qlge->tx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7171
		mutex_init(&tx_ring->tx_lock, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7172
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7173
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7174
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7175
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7176
		rx_ring = &qlge->rx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7177
		mutex_init(&rx_ring->rx_lock, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7178
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7179
		mutex_init(&rx_ring->sbq_lock, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7180
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7181
		mutex_init(&rx_ring->lbq_lock, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7182
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7183
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7184
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7185
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7186
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7187
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7188
/*ARGSUSED*/
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7189
/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7190
 * Simply call pci_ereport_post which generates ereports for errors
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7191
 * that occur in the PCI local bus configuration status registers.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7192
 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7193
static int
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7194
ql_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7195
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7196
	pci_ereport_post(dip, err, NULL);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7197
	return (err->fme_status);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7198
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7199
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7200
static void
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7201
ql_fm_init(qlge_t *qlge)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7202
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7203
	ddi_iblock_cookie_t iblk;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7204
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7205
	QL_PRINT(DBG_INIT, ("ql_fm_init(%d) entered, FMA capability %x\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7206
	    qlge->instance, qlge->fm_capabilities));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7207
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7208
	 * Register capabilities with IO Fault Services. The capabilities
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7209
	 * set above may not be supported by the parent nexus, in that case
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7210
	 * some capability bits may be cleared.
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7211
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7212
	if (qlge->fm_capabilities)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7213
		ddi_fm_init(qlge->dip, &qlge->fm_capabilities, &iblk);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7214
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7215
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7216
	 * Initialize pci ereport capabilities if ereport capable
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7217
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7218
	if (DDI_FM_EREPORT_CAP(qlge->fm_capabilities) ||
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7219
	    DDI_FM_ERRCB_CAP(qlge->fm_capabilities)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7220
		pci_ereport_setup(qlge->dip);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7221
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7222
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7223
	/* Register error callback if error callback capable */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7224
	if (DDI_FM_ERRCB_CAP(qlge->fm_capabilities)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7225
		ddi_fm_handler_register(qlge->dip,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7226
		    ql_fm_error_cb, (void*) qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7227
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7228
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7229
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7230
	 * DDI_FLGERR_ACC indicates:
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7231
	 *  Driver will check its access handle(s) for faults on
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7232
	 *   a regular basis by calling ddi_fm_acc_err_get
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7233
	 *  Driver is able to cope with incorrect results of I/O
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7234
	 *   operations resulted from an I/O fault
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7235
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7236
	if (DDI_FM_ACC_ERR_CAP(qlge->fm_capabilities)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7237
		ql_dev_acc_attr.devacc_attr_access = DDI_FLAGERR_ACC;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7238
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7239
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7240
	/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7241
	 * DDI_DMA_FLAGERR indicates:
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7242
	 *  Driver will check its DMA handle(s) for faults on a
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7243
	 *   regular basis using ddi_fm_dma_err_get
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7244
	 *  Driver is able to cope with incorrect results of DMA
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7245
	 *   operations resulted from an I/O fault
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7246
	 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7247
	if (DDI_FM_DMA_ERR_CAP(qlge->fm_capabilities)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7248
		tx_mapping_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7249
		dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7250
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7251
	QL_PRINT(DBG_INIT, ("ql_fm_init(%d) done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7252
	    qlge->instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7253
}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7254
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7255
static void
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7256
ql_fm_fini(qlge_t *qlge)
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7257
{
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7258
	QL_PRINT(DBG_INIT, ("ql_fm_fini(%d) entered\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7259
	    qlge->instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7260
	/* Only unregister FMA capabilities if we registered some */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7261
	if (qlge->fm_capabilities) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7262
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7263
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7264
		 * Release any resources allocated by pci_ereport_setup()
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7265
		 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7266
		if (DDI_FM_EREPORT_CAP(qlge->fm_capabilities) ||
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7267
		    DDI_FM_ERRCB_CAP(qlge->fm_capabilities))
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7268
			pci_ereport_teardown(qlge->dip);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7269
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7270
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7271
		 * Un-register error callback if error callback capable
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7272
		 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7273
		if (DDI_FM_ERRCB_CAP(qlge->fm_capabilities))
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7274
			ddi_fm_handler_unregister(qlge->dip);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7275
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7276
		/* Unregister from IO Fault Services */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7277
		ddi_fm_fini(qlge->dip);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7278
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7279
	QL_PRINT(DBG_INIT, ("ql_fm_fini(%d) done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7280
	    qlge->instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7281
}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7282
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7283
 * ql_attach - Driver attach.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7284
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7285
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7286
ql_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7287
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7288
	int instance;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7289
	qlge_t *qlge = NULL;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7290
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7291
	uint16_t w;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7292
	mac_register_t *macp = NULL;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7293
	uint32_t data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7294
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7295
	rval = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7296
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7297
	/* first get the instance */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7298
	instance = ddi_get_instance(dip);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7299
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7300
	switch (cmd) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7301
	case DDI_ATTACH:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7302
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7303
		 * Allocate our per-device-instance structure
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7304
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7305
		qlge = (qlge_t *)kmem_zalloc(sizeof (*qlge), KM_SLEEP);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7306
		ASSERT(qlge != NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7307
		qlge->sequence |= INIT_SOFTSTATE_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7308
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7309
		qlge->dip = dip;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7310
		qlge->instance = instance;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7311
		/* Set up the coalescing parameters. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7312
		qlge->ql_dbgprnt = 0;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7313
#if QL_DEBUG
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7314
		qlge->ql_dbgprnt = QL_DEBUG;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7315
#endif /* QL_DEBUG */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7316
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7317
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7318
		 * Initialize for fma support
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7319
		 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7320
		/* fault management (fm) capabilities. */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7321
		qlge->fm_capabilities =
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7322
		    DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7323
		data = ql_get_prop(qlge, "fm-capable");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7324
		if (data <= 0xf) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7325
			qlge->fm_capabilities = data;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7326
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7327
		ql_fm_init(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7328
		qlge->sequence |= INIT_FM;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7329
		QL_PRINT(DBG_INIT, ("ql_attach(%d): fma init done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7330
		    qlge->instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7331
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7332
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7333
		 * Setup the ISP8x00 registers address mapping to be
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7334
		 * accessed by this particular driver.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7335
		 * 0x0   Configuration Space
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7336
		 * 0x1   I/O Space
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7337
		 * 0x2   1st Memory Space address - Control Register Set
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7338
		 * 0x3   2nd Memory Space address - Doorbell Memory Space
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7339
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7340
		w = 2;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7341
		if (ddi_regs_map_setup(dip, w, (caddr_t *)&qlge->iobase, 0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7342
		    sizeof (dev_reg_t), &ql_dev_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7343
		    &qlge->dev_handle) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7344
			cmn_err(CE_WARN, "%s(%d): Unable to map device "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7345
			    "registers", ADAPTER_NAME, instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7346
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7347
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7348
		QL_PRINT(DBG_GLD, ("ql_attach: I/O base = 0x%x\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7349
		    qlge->iobase));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7350
		qlge->sequence |= INIT_REGS_SETUP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7351
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7352
		/* map Doorbell memory space */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7353
		w = 3;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7354
		if (ddi_regs_map_setup(dip, w,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7355
		    (caddr_t *)&qlge->doorbell_reg_iobase, 0,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7356
		    0x100000 /* sizeof (dev_doorbell_reg_t) */,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7357
		    &ql_dev_acc_attr,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7358
		    &qlge->dev_doorbell_reg_handle) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7359
			cmn_err(CE_WARN, "%s(%d): Unable to map Doorbell "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7360
			    "registers",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7361
			    ADAPTER_NAME, instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7362
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7363
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7364
		QL_PRINT(DBG_GLD, ("ql_attach: Doorbell I/O base = 0x%x\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7365
		    qlge->doorbell_reg_iobase));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7366
		qlge->sequence |= INIT_DOORBELL_REGS_SETUP;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7367
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7368
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7369
		 * Allocate a macinfo structure for this instance
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7370
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7371
		if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7372
			cmn_err(CE_WARN, "%s(%d): mac_alloc failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7373
			    __func__, instance);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7374
			break;
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7375
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7376
		/* save adapter status to dip private data */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7377
		ddi_set_driver_private(dip, qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7378
		QL_PRINT(DBG_INIT, ("%s(%d): Allocate macinfo structure done\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7379
		    ADAPTER_NAME, instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7380
		qlge->sequence |= INIT_MAC_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7381
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7382
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7383
		 * Attach this instance of the device
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7384
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7385
		/* Setup PCI Local Bus Configuration resource. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7386
		if (pci_config_setup(dip, &qlge->pci_handle) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7387
			cmn_err(CE_WARN, "%s(%d):Unable to get PCI resources",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7388
			    ADAPTER_NAME, instance);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7389
			if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7390
				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7391
				ddi_fm_service_impact(qlge->dip,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7392
				    DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7393
			}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7394
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7395
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7396
		qlge->sequence |= INIT_PCI_CONFIG_SETUP;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7397
		QL_PRINT(DBG_GLD, ("ql_attach(%d): pci_config_setup done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7398
		    instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7399
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7400
		if (ql_init_instance(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7401
			cmn_err(CE_WARN, "%s(%d): Unable to initialize device "
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7402
			    "instance", ADAPTER_NAME, instance);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7403
			if (qlge->fm_enable) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7404
				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7405
				ddi_fm_service_impact(qlge->dip,
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7406
				    DDI_SERVICE_LOST);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7407
			}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7408
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7409
		}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7410
		QL_PRINT(DBG_GLD, ("ql_attach(%d): ql_init_instance done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7411
		    instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7412
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7413
		/* Setup interrupt vectors */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7414
		if (ql_alloc_irqs(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7415
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7416
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7417
		qlge->sequence |= INIT_INTR_ALLOC;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7418
		QL_PRINT(DBG_GLD, ("ql_attach(%d): ql_alloc_irqs done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7419
		    instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7420
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7421
		/* Configure queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7422
		if (ql_setup_rings(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7423
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7424
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7425
		qlge->sequence |= INIT_SETUP_RINGS;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7426
		QL_PRINT(DBG_GLD, ("ql_attach(%d): setup rings done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7427
		    instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7428
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7429
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7430
		 * Allocate memory resources
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7431
		 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7432
		if (ql_alloc_mem_resources(qlge) != DDI_SUCCESS) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7433
			cmn_err(CE_WARN, "%s(%d): memory allocation failed",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7434
			    __func__, qlge->instance);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7435
			break;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7436
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7437
		qlge->sequence |= INIT_MEMORY_ALLOC;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7438
		QL_PRINT(DBG_GLD, ("ql_alloc_mem_resources(%d) done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7439
		    instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7440
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7441
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7442
		 * Map queues to interrupt vectors
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7443
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7444
		ql_resolve_queues_to_irqs(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7445
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7446
		/* Initialize mutex, need the interrupt priority */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7447
		(void) ql_init_rx_tx_locks(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7448
		qlge->sequence |= INIT_LOCKS_CREATED;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7449
		QL_PRINT(DBG_INIT, ("%s(%d): ql_init_rx_tx_locks done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7450
		    ADAPTER_NAME, instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7451
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7452
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7453
		 * Use a soft interrupt to do something that we do not want
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7454
		 * to do in regular network functions or with mutexs being held
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7455
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7456
		if (ddi_intr_add_softint(qlge->dip, &qlge->mpi_event_intr_hdl,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7457
		    DDI_INTR_SOFTPRI_MIN, ql_mpi_event_work, (caddr_t)qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7458
		    != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7459
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7460
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7461
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7462
		if (ddi_intr_add_softint(qlge->dip, &qlge->asic_reset_intr_hdl,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7463
		    DDI_INTR_SOFTPRI_MIN, ql_asic_reset_work, (caddr_t)qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7464
		    != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7465
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7466
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7467
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7468
		if (ddi_intr_add_softint(qlge->dip, &qlge->mpi_reset_intr_hdl,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7469
		    DDI_INTR_SOFTPRI_MIN, ql_mpi_reset_work, (caddr_t)qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7470
		    != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7471
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7472
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7473
		qlge->sequence |= INIT_ADD_SOFT_INTERRUPT;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7474
		QL_PRINT(DBG_INIT, ("%s(%d): ddi_intr_add_softint done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7475
		    ADAPTER_NAME, instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7476
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7477
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7478
		 * mutex to protect the adapter state structure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7479
		 * initialize mutexes according to the interrupt priority
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7480
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7481
		mutex_init(&qlge->gen_mutex, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7482
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7483
		mutex_init(&qlge->hw_mutex, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7484
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7485
		mutex_init(&qlge->mbx_mutex, NULL, MUTEX_DRIVER,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7486
		    DDI_INTR_PRI(qlge->intr_pri));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7487
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7488
		/* Mailbox wait and interrupt conditional variable. */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7489
		cv_init(&qlge->cv_mbx_intr, NULL, CV_DRIVER, NULL);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7490
		qlge->sequence |= INIT_MUTEX;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7491
		QL_PRINT(DBG_INIT, ("%s(%d): mutex_init done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7492
		    ADAPTER_NAME, instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7493
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7494
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7495
		 * KStats
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7496
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7497
		if (ql_init_kstats(qlge) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7498
			cmn_err(CE_WARN, "%s(%d): KState initialization failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7499
			    ADAPTER_NAME, instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7500
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7501
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7502
		qlge->sequence |= INIT_KSTATS;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7503
		QL_PRINT(DBG_INIT, ("%s(%d): ql_init_kstats done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7504
		    ADAPTER_NAME, instance));
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7505
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7506
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7507
		 * Initialize gld macinfo structure
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7508
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7509
		ql_gld3_init(qlge, macp);
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7510
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7511
		 * Add interrupt handlers
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7512
		 */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7513
		if (ql_add_intr_handlers(qlge) != DDI_SUCCESS) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7514
			cmn_err(CE_WARN, "Failed to add interrupt "
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7515
			    "handlers");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7516
			break;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7517
		}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7518
		qlge->sequence |= INIT_ADD_INTERRUPT;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7519
		QL_PRINT(DBG_INIT, ("%s(%d): Add interrupt handler done\n",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7520
		    ADAPTER_NAME, instance));
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7521
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7522
		/*
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7523
		 * MAC Register
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7524
		 */
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7525
		if (mac_register(macp, &qlge->mh) != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7526
			cmn_err(CE_WARN, "%s(%d): mac_register failed",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7527
			    __func__, instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7528
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7529
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7530
		qlge->sequence |= INIT_MAC_REGISTERED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7531
		QL_PRINT(DBG_GLD, ("%s(%d): mac_register done\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7532
		    ADAPTER_NAME, instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7533
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7534
		mac_free(macp);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7535
		macp = NULL;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7536
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7537
		qlge->mac_flags = QL_MAC_ATTACHED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7538
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7539
		ddi_report_dev(dip);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7540
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7541
		rval = DDI_SUCCESS;
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7542
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7543
	break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7544
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7545
 * DDI_RESUME
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7546
 * When called  with  cmd  set  to  DDI_RESUME,  attach()  must
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7547
 * restore  the hardware state of a device (power may have been
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7548
 * removed from the device), allow  pending  requests  to  con-
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7549
 * tinue,  and  service  new requests. In this case, the driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7550
 * must not  make  any  assumptions  about  the  state  of  the
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7551
 * hardware,  but  must  restore the state of the device except
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7552
 * for the power level of components.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7553
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7554
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7555
	case DDI_RESUME:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7556
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7557
		if ((qlge = (qlge_t *)QL_GET_DEV(dip)) == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7558
			return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7559
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7560
		QL_PRINT(DBG_GLD, ("%s(%d)-DDI_RESUME\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7561
		    __func__, qlge->instance));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7562
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7563
		mutex_enter(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7564
		rval = ql_do_start(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7565
		mutex_exit(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7566
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7567
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7568
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7569
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7570
	}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7571
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7572
	/* if failed to attach */
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7573
	if ((cmd == DDI_ATTACH) && (rval != DDI_SUCCESS) && (qlge != NULL)) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7574
		cmn_err(CE_WARN, "qlge driver attach failed, sequence %x",
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7575
		    qlge->sequence);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7576
		ql_free_resources(qlge);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7577
	}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7578
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7579
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7580
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7581
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7582
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7583
 * Unbind all pending tx dma handles during driver bring down
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7584
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7585
static void
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7586
ql_unbind_pending_tx_dma_handle(struct tx_ring *tx_ring)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7587
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7588
	struct tx_ring_desc *tx_ring_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7589
	int i, j;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7590
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7591
	if (tx_ring->wq_desc) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7592
		tx_ring_desc = tx_ring->wq_desc;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7593
		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7594
			for (j = 0; j < tx_ring_desc->tx_dma_handle_used; j++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7595
				if (tx_ring_desc->tx_dma_handle[j]) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7596
					(void) ddi_dma_unbind_handle(
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7597
					    tx_ring_desc->tx_dma_handle[j]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7598
				}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7599
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7600
			tx_ring_desc->tx_dma_handle_used = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7601
		} /* end of for loop */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7602
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7603
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7604
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7605
 * Wait for all the packets sent to the chip to finish transmission
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7606
 * to prevent buffers to be unmapped before or during a transmit operation
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7607
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7608
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7609
ql_wait_tx_quiesce(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7610
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7611
	int count = MAX_TX_WAIT_COUNT, i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7612
	int rings_done;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7613
	volatile struct tx_ring *tx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7614
	uint32_t consumer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7615
	uint32_t producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7616
	uint32_t temp;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7617
	int done = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7618
	int rval = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7619
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7620
	while (!done) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7621
		rings_done = 0;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7622
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7623
		for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7624
			tx_ring = &qlge->tx_ring[i];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7625
			temp = ql_read_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7626
			    tx_ring->prod_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7627
			producer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7628
			consumer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7629
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7630
			if (qlge->isr_stride) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7631
				struct rx_ring *ob_ring;
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7632
				ob_ring = &qlge->rx_ring[tx_ring->cq_id];
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7633
				if (producer_idx != ob_ring->cnsmr_idx) {
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7634
					cmn_err(CE_NOTE, " force clean \n");
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7635
					(void) ql_clean_outbound_rx_ring(
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7636
					    ob_ring);
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7637
				}
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7638
			}
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7639
			/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7640
			 * Get the pending iocb count, ones which have not been
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7641
			 * pulled down by the chip
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7642
			 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7643
			if (producer_idx >= consumer_idx)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7644
				temp = (producer_idx - consumer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7645
			else
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7646
				temp = (tx_ring->wq_len - consumer_idx) +
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7647
				    producer_idx;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7648
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7649
			if ((tx_ring->tx_free_count + temp) >= tx_ring->wq_len)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7650
				rings_done++;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7651
			else {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7652
				done = 1;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7653
				break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7654
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7655
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7656
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7657
		/* If all the rings are done */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7658
		if (rings_done >= qlge->tx_ring_count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7659
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7660
			cmn_err(CE_NOTE, "%s(%d) done successfully \n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7661
			    __func__, qlge->instance);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7662
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7663
			rval = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7664
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7665
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7666
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7667
		qlge_delay(100);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7668
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7669
		count--;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7670
		if (!count) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7671
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7672
			count = MAX_TX_WAIT_COUNT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7673
#ifdef QLGE_LOAD_UNLOAD
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7674
			volatile struct rx_ring *rx_ring;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7675
			cmn_err(CE_NOTE, "%s(%d): Waiting for %d pending"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7676
			    " Transmits on queue %d to complete .\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7677
			    __func__, qlge->instance,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7678
			    (qlge->tx_ring[i].wq_len -
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7679
			    qlge->tx_ring[i].tx_free_count),
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7680
			    i);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7681
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7682
			rx_ring = &qlge->rx_ring[i+1];
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7683
			temp = ql_read_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7684
			    rx_ring->cnsmr_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7685
			consumer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7686
			producer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7687
			cmn_err(CE_NOTE, "%s(%d): Transmit completion queue %d,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7688
			    " Producer %d, Consumer %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7689
			    __func__, qlge->instance,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7690
			    i+1,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7691
			    producer_idx, consumer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7692
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7693
			temp = ql_read_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7694
			    tx_ring->prod_idx_db_reg);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7695
			producer_idx = temp & 0x0000ffff;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7696
			consumer_idx = (temp >> 16);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7697
			cmn_err(CE_NOTE, "%s(%d): Transmit request queue %d,"
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7698
			    " Producer %d, Consumer %d\n",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7699
			    __func__, qlge->instance, i,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7700
			    producer_idx, consumer_idx);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7701
#endif
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7702
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7703
			/* For now move on */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7704
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7705
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7706
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7707
	/* Stop the request queue */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7708
	mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7709
	for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7710
		if (qlge->tx_ring[i].valid_db_reg) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7711
			ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7712
			    qlge->tx_ring[i].valid_db_reg, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7713
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7714
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7715
	mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7716
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7717
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7718
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7719
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7720
 * Wait for all the receives indicated to the stack to come back
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7721
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7722
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7723
ql_wait_rx_complete(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7724
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7725
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7726
	/* Disable all the completion queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7727
	mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7728
	for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7729
		if (qlge->rx_ring[i].valid_db_reg) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7730
			ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7731
			    qlge->rx_ring[i].valid_db_reg, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7732
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7733
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7734
	mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7735
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7736
	/* Wait for OS to return all rx buffers */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7737
	qlge_delay(QL_ONE_SEC_DELAY);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7738
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7739
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7740
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7741
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7742
 * stop the driver
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7743
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7744
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7745
ql_bringdown_adapter(qlge_t *qlge)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7746
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7747
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7748
	int status = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7749
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7750
	qlge->mac_flags = QL_MAC_BRINGDOWN;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7751
	if (qlge->sequence & ADAPTER_INIT) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7752
		/* stop forwarding external packets to driver */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7753
		status = ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7754
		if (status)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7755
			return (status);
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7756
		(void) ql_stop_routing(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7757
		ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7758
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7759
		 * Set the flag for receive and transmit
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7760
		 * operations to cease
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7761
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7762
		for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7763
			mutex_enter(&qlge->tx_ring[i].tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7764
			qlge->tx_ring[i].mac_flags = QL_MAC_STOPPED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7765
			mutex_exit(&qlge->tx_ring[i].tx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7766
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7767
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7768
		for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7769
			mutex_enter(&qlge->rx_ring[i].rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7770
			qlge->rx_ring[i].mac_flags = QL_MAC_STOPPED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7771
			mutex_exit(&qlge->rx_ring[i].rx_lock);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7772
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7773
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7774
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7775
		 * Need interrupts to be running while the transmit
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7776
		 * completions are cleared. Wait for the packets
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7777
		 * queued to the chip to be sent out
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7778
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7779
		(void) ql_wait_tx_quiesce(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7780
		/* Interrupts not needed from now */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7781
		ql_disable_all_completion_interrupts(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7782
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7783
		mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7784
		/* Disable Global interrupt */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7785
		ql_disable_global_interrupt(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7786
		mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7787
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7788
		/* Wait for all the indicated packets to come back */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7789
		status = ql_wait_rx_complete(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7790
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7791
		mutex_enter(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7792
		/* Reset adapter */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7793
		(void) ql_asic_reset(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7794
		/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7795
		 * Unbind all tx dma handles to prevent pending tx descriptors'
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7796
		 * dma handles from being re-used.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7797
		 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7798
		for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7799
			ql_unbind_pending_tx_dma_handle(&qlge->tx_ring[i]);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7800
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7801
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7802
		qlge->sequence &= ~ADAPTER_INIT;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7803
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7804
		mutex_exit(&qlge->hw_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7805
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7806
	return (status);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7807
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7808
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7809
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7810
 * ql_detach
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7811
 * Used to remove all the states associated with a given
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7812
 * instances of a device node prior to the removal of that
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7813
 * instance from the system.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7814
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7815
static int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7816
ql_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7817
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7818
	qlge_t *qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7819
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7820
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7821
	rval = DDI_SUCCESS;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7822
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7823
	switch (cmd) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7824
	case DDI_DETACH:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7825
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7826
		if ((qlge = QL_GET_DEV(dip)) == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7827
			return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7828
		rval = ql_bringdown_adapter(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7829
		if (rval != DDI_SUCCESS)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7830
			break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7831
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7832
		qlge->mac_flags = QL_MAC_DETACH;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7833
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7834
		/* free memory resources */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7835
		if (qlge->sequence & INIT_MEMORY_ALLOC) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7836
			ql_free_mem_resources(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7837
			qlge->sequence &= ~INIT_MEMORY_ALLOC;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7838
		}
12073
05ba1c0d6140 6923815 Implement FMA functionality in qlge driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 11878
diff changeset
  7839
		ql_free_resources(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7840
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7841
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7842
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7843
	case DDI_SUSPEND:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7844
		if ((qlge = QL_GET_DEV(dip)) == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7845
			return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7846
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7847
		mutex_enter(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7848
		if ((qlge->mac_flags == QL_MAC_ATTACHED) ||
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7849
		    (qlge->mac_flags == QL_MAC_STARTED)) {
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7850
			(void) ql_do_stop(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7851
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7852
		qlge->mac_flags = QL_MAC_SUSPENDED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7853
		mutex_exit(&qlge->gen_mutex);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7854
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7855
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7856
	default:
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7857
		rval = DDI_FAILURE;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7858
		break;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7859
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7860
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7861
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7862
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7863
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7864
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7865
 * quiesce(9E) entry point.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7866
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7867
 * This function is called when the system is single-threaded at high
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7868
 * PIL with preemption disabled. Therefore, this function must not be
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7869
 * blocked.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7870
 *
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7871
 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7872
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7873
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7874
ql_quiesce(dev_info_t *dip)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7875
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7876
	qlge_t *qlge;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7877
	int i;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7878
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7879
	if ((qlge = QL_GET_DEV(dip)) == NULL)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7880
		return (DDI_FAILURE);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7881
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7882
	if (CFG_IST(qlge, CFG_CHIP_8100)) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7883
		/* stop forwarding external packets to driver */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7884
		(void) ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7885
		(void) ql_stop_routing(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7886
		ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7887
		/* Stop all the request queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7888
		for (i = 0; i < qlge->tx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7889
			if (qlge->tx_ring[i].valid_db_reg) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7890
				ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7891
				    qlge->tx_ring[i].valid_db_reg, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7892
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7893
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7894
		qlge_delay(QL_ONE_SEC_DELAY/4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7895
		/* Interrupts not needed from now */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7896
		/* Disable MPI interrupt */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7897
		ql_write_reg(qlge, REG_INTERRUPT_MASK,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7898
		    (INTR_MASK_PI << 16));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7899
		ql_disable_global_interrupt(qlge);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7900
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7901
		/* Disable all the rx completion queues */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7902
		for (i = 0; i < qlge->rx_ring_count; i++) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7903
			if (qlge->rx_ring[i].valid_db_reg) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7904
				ql_write_doorbell_reg(qlge,
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7905
				    qlge->rx_ring[i].valid_db_reg, 0);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7906
			}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7907
		}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7908
		qlge_delay(QL_ONE_SEC_DELAY/4);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7909
		qlge->mac_flags = QL_MAC_STOPPED;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7910
		/* Reset adapter */
11016
efcd833e2d40 6871527 FCoE, qlge driver - Add NIC side of support for new Qlogic FCoE adapter, Europa (fix lint)
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents: 10997
diff changeset
  7911
		(void) ql_asic_reset(qlge);
10997
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7912
		qlge_delay(100);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7913
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7914
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7915
	return (DDI_SUCCESS);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7916
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7917
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7918
QL_STREAM_OPS(ql_ops, ql_attach, ql_detach);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7919
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7920
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7921
 * Loadable Driver Interface Structures.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7922
 * Declare and initialize the module configuration section...
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7923
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7924
static struct modldrv modldrv = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7925
	&mod_driverops,		/* type of module: driver */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7926
	version,		/* name of module */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7927
	&ql_ops			/* driver dev_ops */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7928
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7929
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7930
static struct modlinkage modlinkage = {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7931
	MODREV_1, 	&modldrv,	NULL
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7932
};
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7933
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7934
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7935
 * Loadable Module Routines
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7936
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7937
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7938
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7939
 * _init
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7940
 * Initializes a loadable module. It is called before any other
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7941
 * routine in a loadable module.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7942
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7943
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7944
_init(void)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7945
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7946
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7947
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7948
	mac_init_ops(&ql_ops, ADAPTER_NAME);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7949
	rval = mod_install(&modlinkage);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7950
	if (rval != DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7951
		mac_fini_ops(&ql_ops);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7952
		cmn_err(CE_WARN, "?Unable to install/attach driver '%s'",
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7953
		    ADAPTER_NAME);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7954
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7955
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7956
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7957
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7958
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7959
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7960
 * _fini
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7961
 * Prepares a module for unloading. It is called when the system
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7962
 * wants to unload a module. If the module determines that it can
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7963
 * be unloaded, then _fini() returns the value returned by
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7964
 * mod_remove(). Upon successful return from _fini() no other
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7965
 * routine in the module will be called before _init() is called.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7966
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7967
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7968
_fini(void)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7969
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7970
	int rval;
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7971
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7972
	rval = mod_remove(&modlinkage);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7973
	if (rval == DDI_SUCCESS) {
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7974
		mac_fini_ops(&ql_ops);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7975
	}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7976
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7977
	return (rval);
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7978
}
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7979
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7980
/*
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7981
 * _info
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7982
 * Returns information about loadable module.
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7983
 */
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7984
int
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7985
_info(struct modinfo *modinfop)
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7986
{
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7987
	return (mod_info(&modlinkage, modinfop));
2ff33cc68aa6 PSARC/2009/525 qlge - QLogic PCIe converged NIC driver
Sukumar Swaminathan <Sukumar.Swaminathan@Sun.COM>
parents:
diff changeset
  7988
}