2
* Copyright (c) 2012 Qualcomm Atheros, Inc.
4
* Permission to use, copy, modify, and/or distribute this software for any
5
* purpose with or without fee is hereby granted, provided that the above
6
* copyright notice and this permission notice appear in all copies.
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20
#define ALX_WATCHDOG_TIME (5 * HZ)
22
/* alx_ring_header is a single, contiguous block of memory space
23
* used by the three descriptor rings (tpd, rfd, rrd)
25
struct alx_ring_header {
33
/* alx_buffer wraps around a pointer to a socket buffer
34
* so a DMA physical address can be stored along with the skb
39
DEFINE_DMA_UNMAP_ADDR(dma);
41
DEFINE_DMA_UNMAP_LEN(size);
42
/* information of this buffer */
45
#define ALX_BUF_TX_FIRSTFRAG 0x1
49
struct net_device *netdev;
50
/* device pointer for dma operation */
52
/* rrd ring virtual addr */
53
struct rrd_desc *rrd_hdr;
54
/* rrd ring physical addr */
56
/* rfd ring virtual addr */
57
struct rfd_desc *rfd_hdr;
58
/* rfd ring physical addr */
60
/* info for rx-skbs */
61
struct alx_buffer *bf_info;
63
/* number of ring elements */
65
/* rfd producer index */
67
/* rfd consumer index */
70
/* register saving producer index */
72
/* register saving consumer index */
78
struct sk_buff_head list;
80
#define ALX_RQ_USING 1
81
#define ALX_RX_ALLOC_THRESH 32
85
struct net_device *netdev;
86
/* device pointer for dma operation */
88
/* tpd ring virtual addr */
89
struct tpd_desc *tpd_hdr;
91
/* info for tx-skbs pending on HW */
92
struct alx_buffer *bf_info;
93
/* number of ring elements */
99
/* register saving producer index */
101
/* register saving consumer index */
107
#define ALX_TX_WAKEUP_THRESH(_tq) ((_tq)->count / 4)
108
#define ALX_DEFAULT_TX_WORK 128
111
struct napi_struct napi;
112
struct alx_adapter *adpt;
113
struct alx_rx_queue *rxq;
114
struct alx_tx_queue *txq;
117
char irq_lbl[IFNAMSIZ];
121
ALX_FLAG_USING_MSIX = 0,
127
ALX_FLAG_TASK_PENDING,
128
ALX_FLAG_TASK_CHK_LINK,
130
ALX_FLAG_TASK_UPDATE_SMB,
132
ALX_FLAG_NUMBER_OF_FLAGS,
138
*board specific private data structure
141
struct net_device *netdev;
142
struct pci_dev *pdev;
148
/* totally msix vectors */
150
struct msix_entry *msix_ent;
152
/* all descriptor memory */
153
struct alx_ring_header ring_header;
158
struct alx_napi *qnapi[8];
159
/* number of napi for TX-Q */
161
/* number of napi for RX-Q */
163
/* number independent hw RX-Q */
165
/* total napi for TX-Q/RX-Q */
168
/* lock for updating stats */
171
struct work_struct task;
172
struct net_device_stats net_stats;
178
/* ethtool private flags */
185
#define ALX_FLAG(_adpt, _FLAG) (\
186
test_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags))
187
#define ALX_FLAG_SET(_adpt, _FLAG) (\
188
set_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags))
189
#define ALX_FLAG_CLEAR(_adpt, _FLAG) (\
190
clear_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags))
192
static inline struct alx_rx_queue *alx_hw_rxq(struct alx_rx_queue *rxq)
194
struct alx_adapter *adpt = netdev_priv(rxq->netdev);
196
return ALX_CAP(&adpt->hw, MRQ) ? rxq : adpt->qnapi[0]->rxq;
199
/* needed by alx_ethtool.c */
200
extern void alx_configure(struct alx_adapter *adpt);
201
extern void alx_free_all_ring_resources(struct alx_adapter *adpt);
202
extern int alx_setup_all_ring_resources(struct alx_adapter *adpt);
203
extern void alx_init_def_rss_idt(struct alx_adapter *adpt);
204
extern int alx_alloc_rxring_buf(struct alx_adapter *adpt,
205
struct alx_rx_queue *rxq);
206
extern void alx_init_intr(struct alx_adapter *adpt);
207
extern void alx_disable_advanced_intr(struct alx_adapter *adpt);
208
extern void alx_reinit(struct alx_adapter *adpt);
209
extern void alx_set_ethtool_ops(struct net_device *dev);
210
extern char alx_drv_name[];
211
extern char alx_drv_version[];