Mercurial > illumos > illumos-gate
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 |
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 } |