annotate usr/src/uts/common/io/atge/atge_l1c.c @ 13768:ed21ea5d20cf

212 Atheros AR8132 / L1c Gigabit Ethernet Adapter Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Milan Jurik <milan.jurik@xylab.cz> Approved by: Dan McDonald <danmcd@nexenta.com>
author Gary Mills <gary_mills@fastmail.fm>
date Fri, 10 Aug 2012 10:52:49 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13768
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
2 * CDDL HEADER START
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
3 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
7 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
10 * See the License for the specific language governing permissions
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
11 * and limitations under the License.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
12 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
18 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
19 * CDDL HEADER END
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
20 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
21
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
22 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
23 * Copyright (c) 2012 Gary Mills
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
24 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
25 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
26 * Use is subject to license terms.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
27 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
28 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
29 * Copyright (c) 2009, Pyun YongHyeon <yongari@FreeBSD.org>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
30 * All rights reserved.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
31 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
32 * Redistribution and use in source and binary forms, with or without
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
33 * modification, are permitted provided that the following conditions
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
34 * are met:
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
35 * 1. Redistributions of source code must retain the above copyright
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
36 * notice unmodified, this list of conditions, and the following
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
37 * disclaimer.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
38 * 2. Redistributions in binary form must reproduce the above copyright
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
39 * notice, this list of conditions and the following disclaimer in the
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
40 * documentation and/or other materials provided with the distribution.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
41 *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
42 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
52 * SUCH DAMAGE.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
53 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
54
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
55 #include <sys/types.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
56 #include <sys/stream.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
57 #include <sys/strsun.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
58 #include <sys/stat.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
59 #include <sys/modctl.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
60 #include <sys/ethernet.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
61 #include <sys/debug.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
62 #include <sys/conf.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
63 #include <sys/mii.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
64 #include <sys/miiregs.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
65 #include <sys/sysmacros.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
66 #include <sys/dditypes.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
67 #include <sys/ddi.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
68 #include <sys/sunddi.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
69 #include <sys/byteorder.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
70 #include <sys/note.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
71 #include <sys/vlan.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
72 #include <sys/stream.h>
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
73
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
74 #include "atge.h"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
75 #include "atge_l1c_reg.h"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
76 #include "atge_cmn_reg.h"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
77
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
78 static ddi_dma_attr_t atge_l1c_dma_attr_tx_desc = {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
79 DMA_ATTR_V0, /* dma_attr_version */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
80 0, /* dma_attr_addr_lo */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
81 0x0000ffffffffull, /* dma_attr_addr_hi */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
82 0x0000ffffffffull, /* dma_attr_count_max */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
83 L1C_TX_RING_ALIGN, /* dma_attr_align */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
84 0x0000fffc, /* dma_attr_burstsizes */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
85 1, /* dma_attr_minxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
86 0x0000ffffffffull, /* dma_attr_maxxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
87 0x0000ffffffffull, /* dma_attr_seg */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
88 1, /* dma_attr_sgllen */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
89 1, /* dma_attr_granular */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
90 0 /* dma_attr_flags */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
91 };
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
92
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
93 static ddi_dma_attr_t atge_l1c_dma_attr_rx_desc = {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
94 DMA_ATTR_V0, /* dma_attr_version */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
95 0, /* dma_attr_addr_lo */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
96 0x0000ffffffffull, /* dma_attr_addr_hi */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
97 0x0000ffffffffull, /* dma_attr_count_max */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
98 L1C_RX_RING_ALIGN, /* dma_attr_align */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
99 0x0000fffc, /* dma_attr_burstsizes */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
100 1, /* dma_attr_minxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
101 0x0000ffffffffull, /* dma_attr_maxxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
102 0x0000ffffffffull, /* dma_attr_seg */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
103 1, /* dma_attr_sgllen */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
104 1, /* dma_attr_granular */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
105 0 /* dma_attr_flags */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
106 };
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
107
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
108 static ddi_dma_attr_t atge_l1c_dma_attr_cmb = {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
109 DMA_ATTR_V0, /* dma_attr_version */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
110 0, /* dma_attr_addr_lo */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
111 0x0000ffffffffull, /* dma_attr_addr_hi */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
112 0x0000ffffffffull, /* dma_attr_count_max */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
113 L1C_CMB_ALIGN, /* dma_attr_align */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
114 0x0000fffc, /* dma_attr_burstsizes */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
115 1, /* dma_attr_minxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
116 0x0000ffffffffull, /* dma_attr_maxxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
117 0x0000ffffffffull, /* dma_attr_seg */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
118 1, /* dma_attr_sgllen */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
119 1, /* dma_attr_granular */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
120 0 /* dma_attr_flags */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
121 };
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
122
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
123 static ddi_dma_attr_t atge_l1c_dma_attr_smb = {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
124 DMA_ATTR_V0, /* dma_attr_version */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
125 0, /* dma_attr_addr_lo */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
126 0x0000ffffffffull, /* dma_attr_addr_hi */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
127 0x0000ffffffffull, /* dma_attr_count_max */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
128 L1C_SMB_ALIGN, /* dma_attr_align */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
129 0x0000fffc, /* dma_attr_burstsizes */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
130 1, /* dma_attr_minxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
131 0x0000ffffffffull, /* dma_attr_maxxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
132 0x0000ffffffffull, /* dma_attr_seg */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
133 1, /* dma_attr_sgllen */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
134 1, /* dma_attr_granular */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
135 0 /* dma_attr_flags */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
136 };
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
137
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
138 static ddi_dma_attr_t atge_l1c_dma_attr_rr = {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
139 DMA_ATTR_V0, /* dma_attr_version */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
140 0, /* dma_attr_addr_lo */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
141 0x0000ffffffffull, /* dma_attr_addr_hi */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
142 0x0000ffffffffull, /* dma_attr_count_max */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
143 L1C_RR_RING_ALIGN, /* dma_attr_align */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
144 0x0000fffc, /* dma_attr_burstsizes */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
145 1, /* dma_attr_minxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
146 0x0000ffffffffull, /* dma_attr_maxxfer */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
147 0x0000ffffffffull, /* dma_attr_seg */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
148 1, /* dma_attr_sgllen */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
149 1, /* dma_attr_granular */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
150 0 /* dma_attr_flags */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
151 };
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
152
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
153 int
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
154 atge_l1c_alloc_dma(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
155 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
156 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
157 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
158 int err;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
159
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
160 l1c = kmem_zalloc(sizeof (atge_l1c_data_t), KM_SLEEP);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
161 atgep->atge_private_data = l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
162
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
163 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
164 * Allocate TX ring descriptor.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
165 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
166 atgep->atge_tx_buf_len = atgep->atge_mtu +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
167 sizeof (struct ether_header) + VLAN_TAGSZ + ETHERFCSL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
168 atgep->atge_tx_ring = kmem_alloc(sizeof (atge_ring_t), KM_SLEEP);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
169 atgep->atge_tx_ring->r_atge = atgep;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
170 atgep->atge_tx_ring->r_desc_ring = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
171 dma = atge_alloc_a_dma_blk(atgep, &atge_l1c_dma_attr_tx_desc,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
172 ATGE_TX_RING_SZ, DDI_DMA_RDWR);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
173 if (dma == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
174 atge_error(atgep->atge_dip, "DMA allocation failed for TX"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
175 " desc ring");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
176 return (DDI_FAILURE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
177 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
178 atgep->atge_tx_ring->r_desc_ring = dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
179
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
180 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
181 * Allocate DMA buffers for TX ring.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
182 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
183 err = atge_alloc_buffers(atgep->atge_tx_ring, ATGE_TX_RING_CNT,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
184 atgep->atge_tx_buf_len, DDI_DMA_WRITE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
185 if (err != DDI_SUCCESS) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
186 atge_error(atgep->atge_dip, "DMA allocation failed for"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
187 " TX Ring");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
188 return (err);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
189 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
190
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
191 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
192 * Allocate RX ring.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
193 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
194 atgep->atge_rx_buf_len = atgep->atge_mtu +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
195 sizeof (struct ether_header) + VLAN_TAGSZ + ETHERFCSL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
196 l1c->atge_rx_ring = kmem_alloc(sizeof (atge_ring_t), KM_SLEEP);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
197 l1c->atge_rx_ring->r_atge = atgep;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
198 l1c->atge_rx_ring->r_desc_ring = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
199 dma = atge_alloc_a_dma_blk(atgep, &atge_l1c_dma_attr_rx_desc,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
200 L1C_RX_RING_SZ, DDI_DMA_RDWR);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
201 if (dma == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
202 atge_error(atgep->atge_dip, "DMA allocation failed"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
203 " for RX Ring");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
204 return (DDI_FAILURE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
205 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
206 l1c->atge_rx_ring->r_desc_ring = dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
207
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
208 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
209 * Allocate DMA buffers for RX ring.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
210 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
211 err = atge_alloc_buffers(l1c->atge_rx_ring, L1C_RX_RING_CNT,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
212 atgep->atge_rx_buf_len, DDI_DMA_READ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
213 if (err != DDI_SUCCESS) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
214 atge_error(atgep->atge_dip, "DMA allocation failed for"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
215 " RX buffers");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
216 return (err);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
217 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
218
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
219 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
220 * Allocate CMB used for fetching interrupt status data.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
221 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
222 ATGE_DB(("%s: %s() L1C_CMB_BLOCK_SZ : 0x%x", atgep->atge_name,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
223 __func__, L1C_CMB_BLOCK_SZ));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
224
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
225 dma = atge_alloc_a_dma_blk(atgep, &atge_l1c_dma_attr_cmb,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
226 L1C_CMB_BLOCK_SZ, DDI_DMA_RDWR);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
227 l1c->atge_l1c_cmb = dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
228 if (dma == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
229 atge_error(atgep->atge_dip, "DMA allocation failed for CMB");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
230 return (DDI_FAILURE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
231 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
232
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
233 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
234 * RR ring (Return Ring for RX and TX).
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
235 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
236 ATGE_DB(("%s: %s() L1C_RR_RING_SZ : 0x%x", atgep->atge_name,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
237 __func__, L1C_RR_RING_SZ));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
238
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
239 dma = atge_alloc_a_dma_blk(atgep, &atge_l1c_dma_attr_rr,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
240 L1C_RR_RING_SZ, DDI_DMA_RDWR);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
241 l1c->atge_l1c_rr = dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
242 if (dma == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
243 atge_error(atgep->atge_dip, "DMA allocation failed"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
244 " for RX RR ring");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
245 return (DDI_FAILURE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
246 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
247
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
248 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
249 * SMB for statistics.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
250 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
251 ATGE_DB(("%s: %s() L1C_SMB_BLOCK_SZ : 0x%x", atgep->atge_name,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
252 __func__, L1C_SMB_BLOCK_SZ));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
253
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
254 dma = atge_alloc_a_dma_blk(atgep, &atge_l1c_dma_attr_smb,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
255 L1C_SMB_BLOCK_SZ, DDI_DMA_RDWR);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
256 l1c->atge_l1c_smb = dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
257 if (dma == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
258 atge_error(atgep->atge_dip, "DMA allocation failed for SMB");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
259 return (DDI_FAILURE);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
260 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
261
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
262 atgep->atge_hw_stats = kmem_zalloc(sizeof (atge_l1c_smb_t), KM_SLEEP);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
263
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
264 return (DDI_SUCCESS);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
265 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
266
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
267 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
268 atge_l1c_free_dma(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
269 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
270 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
271
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
272 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
273
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
274 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
275 * Free TX ring.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
276 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
277 if (atgep->atge_tx_ring != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
278 atge_free_buffers(atgep->atge_tx_ring, ATGE_TX_RING_CNT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
279
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
280 if (atgep->atge_tx_ring->r_desc_ring != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
281 atge_free_a_dma_blk(atgep->atge_tx_ring->r_desc_ring);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
282 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
283
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
284 kmem_free(atgep->atge_tx_ring, sizeof (atge_ring_t));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
285 atgep->atge_tx_ring = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
286 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
287
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
288 if (l1c && l1c->atge_l1c_cmb != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
289 atge_free_a_dma_blk(l1c->atge_l1c_cmb);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
290 l1c->atge_l1c_cmb = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
291 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
292
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
293 if (l1c && l1c->atge_l1c_rr != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
294 atge_free_a_dma_blk(l1c->atge_l1c_rr);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
295 l1c->atge_l1c_rr = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
296 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
297
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
298 if (l1c && l1c->atge_l1c_smb != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
299 atge_free_a_dma_blk(l1c->atge_l1c_smb);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
300 l1c->atge_l1c_smb = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
301 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
302
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
303 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
304 * Free RX ring.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
305 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
306 if (l1c && l1c->atge_rx_ring != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
307 atge_free_buffers(l1c->atge_rx_ring, L1C_RX_RING_CNT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
308
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
309 if (l1c->atge_rx_ring->r_desc_ring != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
310 atge_free_a_dma_blk(l1c->atge_rx_ring->r_desc_ring);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
311 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
312
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
313 kmem_free(l1c->atge_rx_ring, sizeof (atge_ring_t));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
314 l1c->atge_rx_ring = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
315 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
316
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
317 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
318 * Free the memory allocated for gathering hw stats.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
319 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
320 if (atgep->atge_hw_stats != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
321 kmem_free(atgep->atge_hw_stats, sizeof (atge_l1c_smb_t));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
322 atgep->atge_hw_stats = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
323 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
324
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
325 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
326 * Free the private area.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
327 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
328 if (l1c != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
329 kmem_free(l1c, sizeof (atge_l1c_data_t));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
330 atgep->atge_private_data = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
331 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
332 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
333
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
334 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
335 atge_l1c_init_rx_ring(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
336 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
337 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
338 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
339 l1c_rx_desc_t *rx;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
340 int i;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
341
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
342 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
343 l1c->atge_rx_ring->r_consumer = L1C_RX_RING_CNT - 1;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
344 dma = l1c->atge_rx_ring->r_desc_ring;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
345 bzero(dma->addr, L1C_RX_RING_SZ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
346
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
347 for (i = 0; i < L1C_RX_RING_CNT; i++) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
348 rx = (l1c_rx_desc_t *)(dma->addr +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
349 (i * sizeof (l1c_rx_desc_t)));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
350
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
351 ATGE_PUT64(dma, &rx->addr,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
352 l1c->atge_rx_ring->r_buf_tbl[i]->cookie.dmac_laddress);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
353 /* No length field. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
354 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
355
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
356 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
357 /* Let controller know availability of new Rx buffers. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
358 OUTL(atgep, ATGE_MBOX_RD0_PROD_IDX, l1c->atge_rx_ring->r_consumer);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
359 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
360
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
361 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
362 atge_l1c_init_tx_ring(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
363 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
364 atgep->atge_tx_ring->r_producer = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
365 atgep->atge_tx_ring->r_consumer = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
366 atgep->atge_tx_ring->r_avail_desc = ATGE_TX_RING_CNT;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
367
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
368 bzero(atgep->atge_tx_ring->r_desc_ring->addr, ATGE_TX_RING_SZ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
369 DMA_SYNC(atgep->atge_tx_ring->r_desc_ring, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
370 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
371
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
372 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
373 atge_l1c_init_rr_ring(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
374 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
375 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
376 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
377
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
378 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
379 l1c->atge_l1c_rr_consumers = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
380
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
381 dma = l1c->atge_l1c_rr;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
382 bzero(dma->addr, L1C_RR_RING_SZ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
383 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
384 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
385
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
386 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
387 atge_l1c_init_smb(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
388 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
389 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
390 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
391
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
392 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
393 dma = l1c->atge_l1c_smb;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
394 bzero(dma->addr, L1C_SMB_BLOCK_SZ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
395 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
396 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
397
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
398 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
399 atge_l1c_init_cmb(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
400 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
401 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
402 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
403
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
404 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
405 dma = l1c->atge_l1c_cmb;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
406 bzero(dma->addr, L1C_CMB_BLOCK_SZ);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
407 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
408 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
409
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
410 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
411 atge_l1c_program_dma(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
412 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
413 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
414 atge_ring_t *r;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
415 uint32_t reg;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
416
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
417 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
418
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
419 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
420 * Clear WOL status and disable all WOL feature as WOL
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
421 * would interfere Rx operation under normal environments.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
422 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
423 (void) INL(atgep, ATGE_WOL_CFG);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
424 OUTL(atgep, ATGE_WOL_CFG, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
425
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
426 /* TX */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
427 r = atgep->atge_tx_ring;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
428 OUTL(atgep, L1C_TX_BASE_ADDR_HI,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
429 ATGE_ADDR_HI(r->r_desc_ring->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
430 OUTL(atgep, L1C_TDL_HEAD_ADDR_LO,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
431 ATGE_ADDR_LO(r->r_desc_ring->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
432 /* We don't use high priority ring. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
433 OUTL(atgep, L1C_TDH_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
434
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
435 /* RX */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
436 r = l1c->atge_rx_ring;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
437 OUTL(atgep, L1C_RX_BASE_ADDR_HI,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
438 ATGE_ADDR_HI(r->r_desc_ring->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
439 OUTL(atgep, L1C_RD0_HEAD_ADDR_LO,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
440 ATGE_ADDR_LO(r->r_desc_ring->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
441 /* We use one Rx ring. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
442 OUTL(atgep, L1C_RD1_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
443 OUTL(atgep, L1C_RD2_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
444 OUTL(atgep, L1C_RD3_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
445
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
446 /* RR Ring */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
447 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
448 * Let hardware split jumbo frames into alc_max_buf_sized chunks.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
449 * if it do not fit the buffer size. Rx return descriptor holds
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
450 * a counter that indicates how many fragments were made by the
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
451 * hardware. The buffer size should be multiple of 8 bytes.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
452 * Since hardware has limit on the size of buffer size, always
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
453 * use the maximum value.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
454 * For strict-alignment architectures make sure to reduce buffer
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
455 * size by 8 bytes to make room for alignment fixup.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
456 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
457 OUTL(atgep, L1C_RX_BUF_SIZE, RX_BUF_SIZE_MAX); /* XXX */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
458
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
459 /* Set Rx return descriptor base addresses. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
460 OUTL(atgep, L1C_RRD0_HEAD_ADDR_LO,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
461 ATGE_ADDR_LO(l1c->atge_l1c_rr->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
462 /* We use one Rx return ring. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
463 OUTL(atgep, L1C_RRD1_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
464 OUTL(atgep, L1C_RRD2_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
465 OUTL(atgep, L1C_RRD3_HEAD_ADDR_LO, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
466
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
467 /* CMB */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
468 OUTL(atgep, L1C_CMB_BASE_ADDR_LO,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
469 ATGE_ADDR_LO(l1c->atge_l1c_cmb->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
470
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
471 /* SMB */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
472 OUTL(atgep, L1C_SMB_BASE_ADDR_HI,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
473 ATGE_ADDR_HI(l1c->atge_l1c_smb->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
474 OUTL(atgep, L1C_SMB_BASE_ADDR_LO,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
475 ATGE_ADDR_LO(l1c->atge_l1c_smb->cookie.dmac_laddress));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
476
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
477 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
478 * Set RX return ring (RR) counter.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
479 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
480 /* Set Rx descriptor counter. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
481 OUTL(atgep, L1C_RD_RING_CNT,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
482 (L1C_RX_RING_CNT << RD_RING_CNT_SHIFT) & RD_RING_CNT_MASK);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
483 /* Set Rx return descriptor counter. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
484 OUTL(atgep, L1C_RRD_RING_CNT,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
485 (L1C_RR_RING_CNT << RRD_RING_CNT_SHIFT) & RRD_RING_CNT_MASK);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
486
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
487 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
488 * Set TX descriptor counter.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
489 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
490 OUTL(atgep, L1C_TD_RING_CNT,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
491 (ATGE_TX_RING_CNT << TD_RING_CNT_SHIFT) & TD_RING_CNT_MASK);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
492
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
493 switch (ATGE_DID(atgep)) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
494 case ATGE_CHIP_AR8152V1_DEV_ID:
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
495 /* Reconfigure SRAM - Vendor magic. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
496 OUTL(atgep, L1C_SRAM_RX_FIFO_LEN, 0x000002A0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
497 OUTL(atgep, L1C_SRAM_TX_FIFO_LEN, 0x00000100);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
498 OUTL(atgep, L1C_SRAM_RX_FIFO_ADDR, 0x029F0000);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
499 OUTL(atgep, L1C_SRAM_RD_ADDR, 0x02BF02A0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
500 OUTL(atgep, L1C_SRAM_TX_FIFO_ADDR, 0x03BF02C0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
501 OUTL(atgep, L1C_SRAM_TRD_ADDR, 0x03DF03C0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
502 OUTL(atgep, L1C_TXF_WATER_MARK, 0x00000000);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
503 OUTL(atgep, L1C_RD_DMA_CFG, 0x00000000);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
504 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
505 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
506
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
507 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
508 * Inform hardware that we have loaded DMA registers.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
509 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
510 OUTL(atgep, ATGE_DMA_BLOCK, DMA_BLOCK_LOAD);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
511
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
512 /* Configure interrupt moderation timer. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
513 reg = ATGE_USECS(atgep->atge_int_rx_mod) << IM_TIMER_RX_SHIFT;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
514 reg |= ATGE_USECS(atgep->atge_int_tx_mod) << IM_TIMER_TX_SHIFT;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
515 OUTL(atgep, ATGE_IM_TIMER, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
516 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
517 * We don't want to automatic interrupt clear as task queue
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
518 * for the interrupt should know interrupt status.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
519 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
520 reg = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
521 if (ATGE_USECS(atgep->atge_int_rx_mod) != 0)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
522 reg |= MASTER_IM_RX_TIMER_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
523 if (ATGE_USECS(atgep->atge_int_tx_mod) != 0)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
524 reg |= MASTER_IM_TX_TIMER_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
525 OUTL(atgep, ATGE_MASTER_CFG, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
526 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
527
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
528 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
529 atge_l1c_clear_stats(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
530 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
531 atge_l1c_smb_t smb;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
532 uint32_t *reg;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
533 int i;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
534
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
535 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
536 * Clear RX stats first.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
537 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
538 i = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
539 reg = &smb.rx_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
540 while (reg++ <= &smb.rx_pkts_filtered) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
541 (void) INL(atgep, ATGE_RX_MIB_BASE + i);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
542 i += sizeof (uint32_t);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
543 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
544
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
545 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
546 * Clear TX stats.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
547 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
548 i = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
549 reg = &smb.tx_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
550 while (reg++ <= &smb.tx_mcast_bytes) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
551 (void) INL(atgep, ATGE_TX_MIB_BASE + i);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
552 i += sizeof (uint32_t);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
553 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
554 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
555
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
556 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
557 atge_l1c_gather_stats(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
558 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
559 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
560 atge_dma_t *dma;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
561 atge_l1c_smb_t *stat;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
562 atge_l1c_smb_t *smb;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
563
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
564 ASSERT(atgep != NULL);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
565
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
566 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
567 dma = l1c->atge_l1c_smb;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
568 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORKERNEL);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
569 stat = (atge_l1c_smb_t *)atgep->atge_hw_stats;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
570 smb = (atge_l1c_smb_t *)dma->addr;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
571
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
572 /* Rx stats. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
573 stat->rx_frames += smb->rx_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
574 stat->rx_bcast_frames += smb->rx_bcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
575 stat->rx_mcast_frames += smb->rx_mcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
576 stat->rx_pause_frames += smb->rx_pause_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
577 stat->rx_control_frames += smb->rx_control_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
578 stat->rx_crcerrs += smb->rx_crcerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
579 stat->rx_lenerrs += smb->rx_lenerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
580 stat->rx_bytes += smb->rx_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
581 stat->rx_runts += smb->rx_runts;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
582 stat->rx_fragments += smb->rx_fragments;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
583 stat->rx_pkts_64 += smb->rx_pkts_64;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
584 stat->rx_pkts_65_127 += smb->rx_pkts_65_127;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
585 stat->rx_pkts_128_255 += smb->rx_pkts_128_255;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
586 stat->rx_pkts_256_511 += smb->rx_pkts_256_511;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
587 stat->rx_pkts_512_1023 += smb->rx_pkts_512_1023;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
588 stat->rx_pkts_1024_1518 += smb->rx_pkts_1024_1518;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
589 stat->rx_pkts_1519_max += smb->rx_pkts_1519_max;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
590 stat->rx_pkts_truncated += smb->rx_pkts_truncated;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
591 stat->rx_fifo_oflows += smb->rx_fifo_oflows;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
592 stat->rx_alignerrs += smb->rx_alignerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
593 stat->rx_bcast_bytes += smb->rx_bcast_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
594 stat->rx_mcast_bytes += smb->rx_mcast_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
595 stat->rx_pkts_filtered += smb->rx_pkts_filtered;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
596
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
597 /* Tx stats. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
598 stat->tx_frames += smb->tx_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
599 stat->tx_bcast_frames += smb->tx_bcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
600 stat->tx_mcast_frames += smb->tx_mcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
601 stat->tx_pause_frames += smb->tx_pause_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
602 stat->tx_excess_defer += smb->tx_excess_defer;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
603 stat->tx_control_frames += smb->tx_control_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
604 stat->tx_deferred += smb->tx_deferred;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
605 stat->tx_bytes += smb->tx_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
606 stat->tx_pkts_64 += smb->tx_pkts_64;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
607 stat->tx_pkts_65_127 += smb->tx_pkts_65_127;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
608 stat->tx_pkts_128_255 += smb->tx_pkts_128_255;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
609 stat->tx_pkts_256_511 += smb->tx_pkts_256_511;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
610 stat->tx_pkts_512_1023 += smb->tx_pkts_512_1023;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
611 stat->tx_pkts_1024_1518 += smb->tx_pkts_1024_1518;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
612 stat->tx_pkts_1519_max += smb->tx_pkts_1519_max;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
613 stat->tx_single_colls += smb->tx_single_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
614 stat->tx_multi_colls += smb->tx_multi_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
615 stat->tx_late_colls += smb->tx_late_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
616 stat->tx_excess_colls += smb->tx_excess_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
617 stat->tx_underrun += smb->tx_underrun;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
618 stat->tx_desc_underrun += smb->tx_desc_underrun;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
619 stat->tx_lenerrs += smb->tx_lenerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
620 stat->tx_pkts_truncated += smb->tx_pkts_truncated;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
621 stat->tx_bcast_bytes += smb->tx_bcast_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
622 stat->tx_mcast_bytes += smb->tx_mcast_bytes;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
623
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
624 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
625 * Update global counters in atge_t.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
626 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
627 atgep->atge_brdcstrcv += smb->rx_bcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
628 atgep->atge_multircv += smb->rx_mcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
629 atgep->atge_multixmt += smb->tx_mcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
630 atgep->atge_brdcstxmt += smb->tx_bcast_frames;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
631
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
632 atgep->atge_align_errors += smb->rx_alignerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
633 atgep->atge_fcs_errors += smb->rx_crcerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
634 atgep->atge_defer_xmts += smb->tx_deferred;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
635 atgep->atge_first_collisions += smb->tx_single_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
636 atgep->atge_multi_collisions += smb->tx_multi_colls * 2;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
637 atgep->atge_tx_late_collisions += smb->tx_late_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
638 atgep->atge_ex_collisions += smb->tx_excess_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
639 atgep->atge_toolong_errors += smb->rx_lenerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
640 atgep->atge_overflow += smb->rx_fifo_oflows;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
641 atgep->atge_underflow += (smb->tx_underrun + smb->tx_desc_underrun);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
642 atgep->atge_runt += smb->rx_runts;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
643
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
644
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
645 atgep->atge_collisions += smb->tx_single_colls +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
646 smb->tx_multi_colls * 2 + smb->tx_late_colls;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
647
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
648 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
649 * tx_pkts_truncated counter looks suspicious. It constantly
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
650 * increments with no sign of Tx errors. Hence we don't factor it.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
651 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
652 atgep->atge_macxmt_errors += smb->tx_late_colls + smb->tx_underrun;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
653
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
654 atgep->atge_macrcv_errors += smb->rx_crcerrs + smb->rx_lenerrs +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
655 smb->rx_runts + smb->rx_pkts_truncated +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
656 smb->rx_alignerrs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
657
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
658 smb->updated = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
659 DMA_SYNC(dma, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
660 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
661
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
662 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
663 atge_l1c_stop_tx_mac(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
664 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
665 uint32_t reg;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
666 int t;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
667
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
668 ATGE_DB(("%s: %s() called", atgep->atge_name, __func__));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
669
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
670 reg = INL(atgep, ATGE_MAC_CFG);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
671 if ((reg & ATGE_CFG_TX_ENB) != 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
672 reg &= ~ATGE_CFG_TX_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
673 OUTL(atgep, ATGE_MAC_CFG, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
674 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
675
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
676 /* Stop TX DMA engine. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
677 reg = INL(atgep, ATGE_DMA_CFG);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
678 if ((reg & DMA_CFG_RD_ENB) != 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
679 reg &= ~DMA_CFG_RD_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
680 OUTL(atgep, ATGE_DMA_CFG, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
681 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
682
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
683 for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
684 if ((INL(atgep, ATGE_IDLE_STATUS) &
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
685 (IDLE_STATUS_TXMAC | IDLE_STATUS_DMARD)) == 0)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
686 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
687
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
688 drv_usecwait(10);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
689 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
690
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
691 if (t == 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
692 /* This should be an FMA event. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
693 atge_error(atgep->atge_dip, "stopping TX DMA Engine timeout");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
694 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
695 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
696
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
697 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
698 atge_l1c_stop_rx_mac(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
699 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
700 uint32_t reg;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
701 int t;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
702
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
703 ATGE_DB(("%s: %s() called", atgep->atge_name, __func__));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
704
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
705 reg = INL(atgep, ATGE_MAC_CFG);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
706 if ((reg & ATGE_CFG_RX_ENB) != 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
707 reg &= ~ATGE_CFG_RX_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
708 OUTL(atgep, ATGE_MAC_CFG, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
709 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
710
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
711 /* Stop RX DMA engine. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
712 reg = INL(atgep, ATGE_DMA_CFG);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
713 if ((reg & DMA_CFG_WR_ENB) != 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
714 reg &= ~DMA_CFG_WR_ENB;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
715 OUTL(atgep, ATGE_DMA_CFG, reg);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
716 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
717
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
718 for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
719 if ((INL(atgep, ATGE_IDLE_STATUS) &
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
720 (IDLE_STATUS_RXMAC | IDLE_STATUS_DMAWR)) == 0)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
721 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
722 drv_usecwait(10);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
723 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
724
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
725 if (t == 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
726 /* This should be an FMA event. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
727 atge_error(atgep->atge_dip, " stopping RX DMA Engine timeout");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
728 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
729 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
730
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
731 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
732 * Receives (consumes) packets.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
733 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
734 static mblk_t *
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
735 atge_l1c_rx(atge_t *atgep)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
736 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
737 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
738 mblk_t *mp = NULL, *rx_head = NULL, *rx_tail = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
739 l1c_rx_rdesc_t *rx_rr;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
740 uint32_t rdinfo, status, totlen, pktlen, slotlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
741 int nsegs, rx_cons = 0, cnt;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
742 atge_dma_t *buf;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
743 uchar_t *bufp;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
744 int sync = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
745
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
746 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
747 ASSERT(l1c != NULL);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
748
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
749 DMA_SYNC(l1c->atge_l1c_rr, 0, 0, DDI_DMA_SYNC_FORKERNEL);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
750 for (;;) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
751 rx_rr = (l1c_rx_rdesc_t *)(l1c->atge_l1c_rr->addr +
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
752 (l1c->atge_l1c_rr_consumers * sizeof (l1c_rx_rdesc_t)));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
753
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
754 rdinfo = ATGE_GET32(l1c->atge_l1c_rr, &rx_rr->rdinfo);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
755 status = ATGE_GET32(l1c->atge_l1c_rr, &rx_rr->status);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
756
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
757 rx_cons = L1C_RRD_RD_IDX(rdinfo);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
758 nsegs = L1C_RRD_RD_CNT(rdinfo);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
759 totlen = L1C_RRD_BYTES(status);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
760
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
761 ATGE_DB(("%s: %s() PKT -- rdinfo : 0x%x,"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
762 "status : 0x%x, totlen : %d,"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
763 " rx_cons : %d, nsegs : %d", atgep->atge_name, __func__,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
764 rdinfo, status, totlen, rx_cons, nsegs));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
765
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
766 if ((status & L1C_RRD_VALID) == 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
767 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
768 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
769
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
770 if ((status & (L1C_RRD_ERR_CRC | L1C_RRD_ERR_ALIGN |
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
771 L1C_RRD_ERR_TRUNC | L1C_RRD_ERR_RUNT |
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
772 L1C_RRD_ERR_ICMP | L1C_RRD_ERR_LENGTH)) != 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
773 atge_error(atgep->atge_dip, "errored pkt");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
774
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
775 l1c->atge_rx_ring->r_consumer += nsegs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
776 l1c->atge_rx_ring->r_consumer %= L1C_RX_RING_CNT;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
777 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
778 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
779
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
780 ASSERT(rx_cons >= 0 && rx_cons <= L1C_RX_RING_CNT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
781
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
782 mp = allocb(totlen + L1C_HEADROOM, BPRI_MED);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
783 if (mp != NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
784 mp->b_rptr += L1C_HEADROOM;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
785 bufp = mp->b_rptr;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
786 mp->b_wptr = bufp + totlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
787 mp->b_next = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
788
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
789 atgep->atge_ipackets++;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
790 atgep->atge_rbytes += totlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
791
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
792 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
793 * If there are more than one segments, then the first
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
794 * segment should be of size MTU. We couldn't verify
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
795 * this as our driver does not support changing MTU
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
796 * or Jumbo Frames.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
797 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
798 if (nsegs > 1) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
799 slotlen = atgep->atge_mtu;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
800 } else {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
801 slotlen = totlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
802 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
803 } else {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
804 ATGE_DB(("%s: %s() PKT mp == NULL totlen : %d",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
805 atgep->atge_name, __func__, totlen));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
806
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
807 if (slotlen > atgep->atge_rx_buf_len) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
808 atgep->atge_toolong_errors++;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
809 } else if (mp == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
810 atgep->atge_norcvbuf++;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
811 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
812
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
813 rx_rr->status = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
814 break;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
815 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
816
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
817 for (cnt = 0, pktlen = 0; cnt < nsegs; cnt++) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
818 buf = l1c->atge_rx_ring->r_buf_tbl[rx_cons];
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
819
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
820 slotlen = min(atgep->atge_max_frame_size, totlen);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
821
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
822 bcopy(buf->addr, (bufp + pktlen), slotlen);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
823 pktlen += slotlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
824 totlen -= slotlen;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
825
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
826 ATGE_DB(("%s: %s() len : %d, rxcons : %d, pktlen : %d",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
827 atgep->atge_name, __func__, slotlen, rx_cons,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
828 pktlen));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
829
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
830 ATGE_INC_SLOT(rx_cons, L1C_RX_RING_CNT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
831 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
832
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
833 if (rx_tail == NULL) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
834 rx_head = rx_tail = mp;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
835 } else {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
836 rx_tail->b_next = mp;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
837 rx_tail = mp;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
838 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
839
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
840 if (cnt != nsegs) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
841 l1c->atge_rx_ring->r_consumer += nsegs;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
842 l1c->atge_rx_ring->r_consumer %= L1C_RX_RING_CNT;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
843 } else {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
844 l1c->atge_rx_ring->r_consumer = rx_cons;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
845 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
846
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
847 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
848 * Tell the chip that this RR can be reused.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
849 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
850 rx_rr->status = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
851
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
852 ATGE_INC_SLOT(l1c->atge_l1c_rr_consumers, L1C_RR_RING_CNT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
853 sync++;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
854 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
855
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
856 if (sync) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
857 DMA_SYNC(l1c->atge_rx_ring->r_desc_ring, 0, 0,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
858 DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
859
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
860 DMA_SYNC(l1c->atge_l1c_rr, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
861 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
862 * Let controller know availability of new Rx buffers.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
863 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
864 OUTL(atgep, ATGE_MBOX_RD0_PROD_IDX,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
865 l1c->atge_rx_ring->r_consumer);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
866
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
867 ATGE_DB(("%s: %s() PKT Recved -> r_consumer : %d, rx_cons : %d"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
868 " atge_l1c_rr_consumers : %d",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
869 atgep->atge_name, __func__, l1c->atge_rx_ring->r_consumer,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
870 rx_cons, l1c->atge_l1c_rr_consumers));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
871 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
872
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
873
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
874 return (rx_head);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
875 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
876
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
877 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
878 * The interrupt handler for L1C chip.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
879 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
880 /*ARGSUSED*/
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
881 uint_t
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
882 atge_l1c_interrupt(caddr_t arg1, caddr_t arg2)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
883 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
884 atge_t *atgep = (void *)arg1;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
885 mblk_t *rx_head = NULL;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
886 uint32_t status;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
887 int resched = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
888
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
889 ASSERT(atgep != NULL);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
890
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
891 mutex_enter(&atgep->atge_intr_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
892
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
893 if (atgep->atge_chip_state & ATGE_CHIP_SUSPENDED) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
894 mutex_exit(&atgep->atge_intr_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
895 return (DDI_INTR_UNCLAIMED);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
896 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
897
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
898 status = INL(atgep, ATGE_INTR_STATUS);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
899 if (status == 0 || (status & atgep->atge_intrs) == 0) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
900 mutex_exit(&atgep->atge_intr_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
901
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
902 if (atgep->atge_flags & ATGE_FIXED_TYPE)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
903 return (DDI_INTR_UNCLAIMED);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
904
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
905 return (DDI_INTR_CLAIMED);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
906 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
907
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
908 ATGE_DB(("%s: %s() entry status : %x",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
909 atgep->atge_name, __func__, status));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
910
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
911 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
912 * Disable interrupts.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
913 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
914 if (status & L1C_INTR_GPHY) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
915 /* clear PHY interrupt source before we ack interrupts */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
916 (void) atge_mii_read(atgep,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
917 atgep->atge_phyaddr, ATGE_ISR_ACK_GPHY);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
918 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
919
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
920 OUTL(atgep, ATGE_INTR_STATUS, status | L1C_INTR_DIS_INT);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
921 FLUSH(atgep, ATGE_INTR_STATUS);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
922
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
923 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
924 * Check if chip is running, only then do the work.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
925 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
926 if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
927 atge_l1c_data_t *l1c;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
928
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
929 l1c = atgep->atge_private_data;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
930
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
931 ATGE_DB(("%s: %s() atge_l1c_intr_status : %x, "
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
932 "atge_l1c_rx_prod_cons : %d, atge_l1c_tx_prod_cons : %d"
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
933 " atge_l1c_rr_consumers : %d",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
934 atgep->atge_name, __func__, l1c->atge_l1c_intr_status,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
935 l1c->atge_l1c_rx_prod_cons, l1c->atge_l1c_tx_prod_cons,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
936 l1c->atge_l1c_rr_consumers));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
937
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
938 if (status & L1C_INTR_SMB)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
939 atge_l1c_gather_stats(atgep);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
940
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
941 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
942 * Check for errors.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
943 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
944 if (status & (L1C_INTR_DMA_RD_TO_RST |
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
945 L1C_INTR_DMA_WR_TO_RST | L1C_INTR_TXQ_TO_RST)) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
946 /* This should be an FMA event. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
947 atge_error(atgep->atge_dip,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
948 "L1C chip detected a fatal error, "
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
949 "interrupt status: %x", status);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
950
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
951 if (status & L1C_INTR_DMA_RD_TO_RST) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
952 atge_error(atgep->atge_dip,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
953 "DMA read error");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
954 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
955 if (status & L1C_INTR_DMA_WR_TO_RST) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
956 atge_error(atgep->atge_dip,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
957 "DMA write error");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
958 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
959 if (status & L1C_INTR_TXQ_TO_RST) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
960 atge_error(atgep->atge_dip,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
961 "Transmit queue error");
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
962 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
963
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
964 /* This should be an FMA event. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
965 atge_device_stop(atgep);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
966 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
967 * Device has failed fatally.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
968 * It will not be restarted by the driver.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
969 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
970 goto done;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
971
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
972 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
973
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
974 rx_head = atge_l1c_rx(atgep);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
975 if (status & L1C_INTR_TX_PKT) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
976 int cons;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
977
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
978 mutex_enter(&atgep->atge_tx_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
979 cons = INL(atgep, ATGE_MBOX_TD_CONS_IDX) >> 16;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
980 atge_tx_reclaim(atgep, cons);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
981 if (atgep->atge_tx_resched) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
982 atgep->atge_tx_resched = 0;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
983 resched = 1;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
984 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
985
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
986 mutex_exit(&atgep->atge_tx_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
987 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
988 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
989
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
990 /* Re-enable interrupts. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
991 OUTL(atgep, ATGE_INTR_STATUS, 0);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
992
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
993 done:
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
994 mutex_exit(&atgep->atge_intr_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
995
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
996 if (status & L1C_INTR_GPHY) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
997 /* link down */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
998 ATGE_DB(("%s: %s() MII_CHECK Performed",
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
999 atgep->atge_name, __func__));
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1000 mii_check(atgep->atge_mii);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1001 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1002
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1003 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1004 * Pass the list of packets received from chip to MAC layer.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1005 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1006 if (rx_head) {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1007 mac_rx(atgep->atge_mh, 0, rx_head);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1008 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1009
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1010 /*
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1011 * Let MAC start sending pkts if the downstream was asked to pause.
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1012 */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1013 if (resched)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1014 mac_tx_update(atgep->atge_mh);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1015
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1016 return (DDI_INTR_CLAIMED);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1017 }
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1018
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1019 void
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1020 atge_l1c_send_packet(atge_ring_t *r)
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1021 {
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1022 atge_t *atgep;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1023
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1024 atgep = r->r_atge;
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1025
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1026 mutex_enter(&atgep->atge_mbox_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1027 /* Sync descriptors. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1028 DMA_SYNC(atgep->atge_tx_ring->r_desc_ring, 0, 0, DDI_DMA_SYNC_FORDEV);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1029 /* Kick. Assume we're using normal Tx priority queue. */
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1030 OUTL(atgep, ATGE_MBOX_TD_PROD_IDX,
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1031 (atgep->atge_tx_ring->r_producer << MBOX_TD_PROD_LO_IDX_SHIFT) &
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1032 MBOX_TD_PROD_LO_IDX_MASK);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1033 mutex_exit(&atgep->atge_mbox_lock);
ed21ea5d20cf 212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Gary Mills <gary_mills@fastmail.fm>
parents:
diff changeset
1034 }