1 /*
2  * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net>
3  *
4  *  This file is free software: you may copy, redistribute and/or modify it
5  *  under the terms of the GNU General Public License as published by the
6  *  Free Software Foundation, either version 2 of the License, or (at your
7  *  option) any later version.
8  *
9  *  This file is distributed in the hope that it will be useful, but
10  *  WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  * This file incorporates work covered by the following copyright and
18  * permission notice:
19  *
20  * Copyright (c) 2012 Qualcomm Atheros, Inc.
21  *
22  * Permission to use, copy, modify, and/or distribute this software for any
23  * purpose with or without fee is hereby granted, provided that the above
24  * copyright notice and this permission notice appear in all copies.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
27  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
28  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
29  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
31  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
33  */
34 
35 #ifndef _ALX_H_
36 #define _ALX_H_
37 
38 #include <linux/types.h>
39 #include <linux/etherdevice.h>
40 #include <linux/dma-mapping.h>
41 #include <linux/spinlock.h>
42 #include "hw.h"
43 
44 #define ALX_WATCHDOG_TIME   (5 * HZ)
45 
46 struct alx_buffer {
47 	struct sk_buff *skb;
48 	DEFINE_DMA_UNMAP_ADDR(dma);
49 	DEFINE_DMA_UNMAP_LEN(size);
50 };
51 
52 struct alx_rx_queue {
53 	struct net_device *netdev;
54 	struct device *dev;
55 	struct alx_napi *np;
56 
57 	struct alx_rrd *rrd;
58 	dma_addr_t rrd_dma;
59 
60 	struct alx_rfd *rfd;
61 	dma_addr_t rfd_dma;
62 
63 	struct alx_buffer *bufs;
64 
65 	u16 count;
66 	u16 write_idx, read_idx;
67 	u16 rrd_read_idx;
68 	u16 queue_idx;
69 };
70 #define ALX_RX_ALLOC_THRESH	32
71 
72 struct alx_tx_queue {
73 	struct net_device *netdev;
74 	struct device *dev;
75 
76 	struct alx_txd *tpd;
77 	dma_addr_t tpd_dma;
78 
79 	struct alx_buffer *bufs;
80 
81 	u16 count;
82 	u16 write_idx, read_idx;
83 	u16 queue_idx;
84 	u16 p_reg, c_reg;
85 };
86 
87 #define ALX_DEFAULT_TX_WORK 128
88 
89 enum alx_device_quirks {
90 	ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG = BIT(0),
91 };
92 
93 struct alx_napi {
94 	struct napi_struct	napi;
95 	struct alx_priv		*alx;
96 	struct alx_rx_queue	*rxq;
97 	struct alx_tx_queue	*txq;
98 	int			vec_idx;
99 	u32			vec_mask;
100 	char			irq_lbl[IFNAMSIZ + 8];
101 };
102 
103 #define ALX_MAX_NAPIS 8
104 
105 struct alx_priv {
106 	struct net_device *dev;
107 
108 	struct alx_hw hw;
109 
110 	/* msi-x vectors */
111 	int num_vec;
112 
113 	/* all descriptor memory */
114 	struct {
115 		dma_addr_t dma;
116 		void *virt;
117 		unsigned int size;
118 	} descmem;
119 
120 	struct alx_napi *qnapi[ALX_MAX_NAPIS];
121 	int num_txq;
122 	int num_rxq;
123 	int num_napi;
124 
125 	/* protect int_mask updates */
126 	spinlock_t irq_lock;
127 	u32 int_mask;
128 
129 	unsigned int tx_ringsz;
130 	unsigned int rx_ringsz;
131 	unsigned int rxbuf_size;
132 
133 	struct work_struct link_check_wk;
134 	struct work_struct reset_wk;
135 
136 	u16 msg_enable;
137 
138 	/* protects hw.stats */
139 	spinlock_t stats_lock;
140 };
141 
142 extern const struct ethtool_ops alx_ethtool_ops;
143 
144 #endif
145