diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2009-11-29 10:12:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-29 20:23:55 -0500 |
commit | 744093c98363f8a65853aed39708c9effc80f8ff (patch) | |
tree | 174d8f888397ece9cdb933300f0045392a552109 /drivers/net/sfc/nic.h | |
parent | c383b53729a9bbbceee132a85955d084ba00ca3a (diff) |
sfc: Rename falcon.h to nic.h
nic.h is no longer specific to Falcon.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc/nic.h')
-rw-r--r-- | drivers/net/sfc/nic.h | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/drivers/net/sfc/nic.h b/drivers/net/sfc/nic.h new file mode 100644 index 000000000000..e7eb30488c15 --- /dev/null +++ b/drivers/net/sfc/nic.h | |||
@@ -0,0 +1,238 @@ | |||
1 | /**************************************************************************** | ||
2 | * Driver for Solarflare Solarstorm network controllers and boards | ||
3 | * Copyright 2005-2006 Fen Systems Ltd. | ||
4 | * Copyright 2006-2008 Solarflare Communications Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation, incorporated herein by reference. | ||
9 | */ | ||
10 | |||
11 | #ifndef EFX_NIC_H | ||
12 | #define EFX_NIC_H | ||
13 | |||
14 | #include <linux/i2c-algo-bit.h> | ||
15 | #include "net_driver.h" | ||
16 | #include "efx.h" | ||
17 | |||
18 | /* | ||
19 | * Falcon hardware control | ||
20 | */ | ||
21 | |||
22 | enum { | ||
23 | EFX_REV_FALCON_A0 = 0, | ||
24 | EFX_REV_FALCON_A1 = 1, | ||
25 | EFX_REV_FALCON_B0 = 2, | ||
26 | }; | ||
27 | |||
28 | static inline int efx_nic_rev(struct efx_nic *efx) | ||
29 | { | ||
30 | return efx->type->revision; | ||
31 | } | ||
32 | |||
33 | extern u32 efx_nic_fpga_ver(struct efx_nic *efx); | ||
34 | |||
35 | /* NIC has two interlinked PCI functions for the same port. */ | ||
36 | static inline bool efx_nic_is_dual_func(struct efx_nic *efx) | ||
37 | { | ||
38 | return efx_nic_rev(efx) < EFX_REV_FALCON_B0; | ||
39 | } | ||
40 | |||
41 | enum { | ||
42 | PHY_TYPE_NONE = 0, | ||
43 | PHY_TYPE_TXC43128 = 1, | ||
44 | PHY_TYPE_88E1111 = 2, | ||
45 | PHY_TYPE_SFX7101 = 3, | ||
46 | PHY_TYPE_QT2022C2 = 4, | ||
47 | PHY_TYPE_PM8358 = 6, | ||
48 | PHY_TYPE_SFT9001A = 8, | ||
49 | PHY_TYPE_QT2025C = 9, | ||
50 | PHY_TYPE_SFT9001B = 10, | ||
51 | }; | ||
52 | |||
53 | #define FALCON_XMAC_LOOPBACKS \ | ||
54 | ((1 << LOOPBACK_XGMII) | \ | ||
55 | (1 << LOOPBACK_XGXS) | \ | ||
56 | (1 << LOOPBACK_XAUI)) | ||
57 | |||
58 | #define FALCON_GMAC_LOOPBACKS \ | ||
59 | (1 << LOOPBACK_GMAC) | ||
60 | |||
61 | /** | ||
62 | * struct falcon_board_type - board operations and type information | ||
63 | * @id: Board type id, as found in NVRAM | ||
64 | * @ref_model: Model number of Solarflare reference design | ||
65 | * @gen_type: Generic board type description | ||
66 | * @init: Allocate resources and initialise peripheral hardware | ||
67 | * @init_phy: Do board-specific PHY initialisation | ||
68 | * @fini: Shut down hardware and free resources | ||
69 | * @set_id_led: Set state of identifying LED or revert to automatic function | ||
70 | * @monitor: Board-specific health check function | ||
71 | */ | ||
72 | struct falcon_board_type { | ||
73 | u8 id; | ||
74 | const char *ref_model; | ||
75 | const char *gen_type; | ||
76 | int (*init) (struct efx_nic *nic); | ||
77 | void (*init_phy) (struct efx_nic *efx); | ||
78 | void (*fini) (struct efx_nic *nic); | ||
79 | void (*set_id_led) (struct efx_nic *efx, enum efx_led_mode mode); | ||
80 | int (*monitor) (struct efx_nic *nic); | ||
81 | }; | ||
82 | |||
83 | /** | ||
84 | * struct falcon_board - board information | ||
85 | * @type: Type of board | ||
86 | * @major: Major rev. ('A', 'B' ...) | ||
87 | * @minor: Minor rev. (0, 1, ...) | ||
88 | * @i2c_adap: I2C adapter for on-board peripherals | ||
89 | * @i2c_data: Data for bit-banging algorithm | ||
90 | * @hwmon_client: I2C client for hardware monitor | ||
91 | * @ioexp_client: I2C client for power/port control | ||
92 | */ | ||
93 | struct falcon_board { | ||
94 | const struct falcon_board_type *type; | ||
95 | int major; | ||
96 | int minor; | ||
97 | struct i2c_adapter i2c_adap; | ||
98 | struct i2c_algo_bit_data i2c_data; | ||
99 | struct i2c_client *hwmon_client, *ioexp_client; | ||
100 | }; | ||
101 | |||
102 | /** | ||
103 | * struct falcon_nic_data - Falcon NIC state | ||
104 | * @pci_dev2: Secondary function of Falcon A | ||
105 | * @board: Board state and functions | ||
106 | * @stats_disable_count: Nest count for disabling statistics fetches | ||
107 | * @stats_pending: Is there a pending DMA of MAC statistics. | ||
108 | * @stats_timer: A timer for regularly fetching MAC statistics. | ||
109 | * @stats_dma_done: Pointer to the flag which indicates DMA completion. | ||
110 | */ | ||
111 | struct falcon_nic_data { | ||
112 | struct pci_dev *pci_dev2; | ||
113 | struct falcon_board board; | ||
114 | unsigned int stats_disable_count; | ||
115 | bool stats_pending; | ||
116 | struct timer_list stats_timer; | ||
117 | u32 *stats_dma_done; | ||
118 | }; | ||
119 | |||
120 | static inline struct falcon_board *falcon_board(struct efx_nic *efx) | ||
121 | { | ||
122 | struct falcon_nic_data *data = efx->nic_data; | ||
123 | return &data->board; | ||
124 | } | ||
125 | |||
126 | extern struct efx_nic_type falcon_a1_nic_type; | ||
127 | extern struct efx_nic_type falcon_b0_nic_type; | ||
128 | |||
129 | /************************************************************************** | ||
130 | * | ||
131 | * Externs | ||
132 | * | ||
133 | ************************************************************************** | ||
134 | */ | ||
135 | |||
136 | extern void falcon_probe_board(struct efx_nic *efx, u16 revision_info); | ||
137 | |||
138 | /* TX data path */ | ||
139 | extern int efx_nic_probe_tx(struct efx_tx_queue *tx_queue); | ||
140 | extern void efx_nic_init_tx(struct efx_tx_queue *tx_queue); | ||
141 | extern void efx_nic_fini_tx(struct efx_tx_queue *tx_queue); | ||
142 | extern void efx_nic_remove_tx(struct efx_tx_queue *tx_queue); | ||
143 | extern void efx_nic_push_buffers(struct efx_tx_queue *tx_queue); | ||
144 | |||
145 | /* RX data path */ | ||
146 | extern int efx_nic_probe_rx(struct efx_rx_queue *rx_queue); | ||
147 | extern void efx_nic_init_rx(struct efx_rx_queue *rx_queue); | ||
148 | extern void efx_nic_fini_rx(struct efx_rx_queue *rx_queue); | ||
149 | extern void efx_nic_remove_rx(struct efx_rx_queue *rx_queue); | ||
150 | extern void efx_nic_notify_rx_desc(struct efx_rx_queue *rx_queue); | ||
151 | |||
152 | /* Event data path */ | ||
153 | extern int efx_nic_probe_eventq(struct efx_channel *channel); | ||
154 | extern void efx_nic_init_eventq(struct efx_channel *channel); | ||
155 | extern void efx_nic_fini_eventq(struct efx_channel *channel); | ||
156 | extern void efx_nic_remove_eventq(struct efx_channel *channel); | ||
157 | extern int efx_nic_process_eventq(struct efx_channel *channel, int rx_quota); | ||
158 | extern void efx_nic_eventq_read_ack(struct efx_channel *channel); | ||
159 | |||
160 | /* MAC/PHY */ | ||
161 | extern void falcon_drain_tx_fifo(struct efx_nic *efx); | ||
162 | extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx); | ||
163 | extern int efx_nic_rx_xoff_thresh, efx_nic_rx_xon_thresh; | ||
164 | |||
165 | /* Interrupts and test events */ | ||
166 | extern int efx_nic_init_interrupt(struct efx_nic *efx); | ||
167 | extern void efx_nic_enable_interrupts(struct efx_nic *efx); | ||
168 | extern void efx_nic_generate_test_event(struct efx_channel *channel, | ||
169 | unsigned int magic); | ||
170 | extern void efx_nic_generate_interrupt(struct efx_nic *efx); | ||
171 | extern void efx_nic_disable_interrupts(struct efx_nic *efx); | ||
172 | extern void efx_nic_fini_interrupt(struct efx_nic *efx); | ||
173 | extern irqreturn_t efx_nic_fatal_interrupt(struct efx_nic *efx); | ||
174 | extern irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id); | ||
175 | extern void falcon_irq_ack_a1(struct efx_nic *efx); | ||
176 | |||
177 | #define EFX_IRQ_MOD_RESOLUTION 5 | ||
178 | |||
179 | /* Global Resources */ | ||
180 | extern int efx_nic_flush_queues(struct efx_nic *efx); | ||
181 | extern void falcon_start_nic_stats(struct efx_nic *efx); | ||
182 | extern void falcon_stop_nic_stats(struct efx_nic *efx); | ||
183 | extern int falcon_reset_xaui(struct efx_nic *efx); | ||
184 | extern void efx_nic_init_common(struct efx_nic *efx); | ||
185 | |||
186 | int efx_nic_alloc_buffer(struct efx_nic *efx, struct efx_buffer *buffer, | ||
187 | unsigned int len); | ||
188 | void efx_nic_free_buffer(struct efx_nic *efx, struct efx_buffer *buffer); | ||
189 | |||
190 | /* Tests */ | ||
191 | struct efx_nic_register_test { | ||
192 | unsigned address; | ||
193 | efx_oword_t mask; | ||
194 | }; | ||
195 | extern int efx_nic_test_registers(struct efx_nic *efx, | ||
196 | const struct efx_nic_register_test *regs, | ||
197 | size_t n_regs); | ||
198 | |||
199 | /************************************************************************** | ||
200 | * | ||
201 | * Falcon MAC stats | ||
202 | * | ||
203 | ************************************************************************** | ||
204 | */ | ||
205 | |||
206 | #define FALCON_STAT_OFFSET(falcon_stat) EFX_VAL(falcon_stat, offset) | ||
207 | #define FALCON_STAT_WIDTH(falcon_stat) EFX_VAL(falcon_stat, WIDTH) | ||
208 | |||
209 | /* Retrieve statistic from statistics block */ | ||
210 | #define FALCON_STAT(efx, falcon_stat, efx_stat) do { \ | ||
211 | if (FALCON_STAT_WIDTH(falcon_stat) == 16) \ | ||
212 | (efx)->mac_stats.efx_stat += le16_to_cpu( \ | ||
213 | *((__force __le16 *) \ | ||
214 | (efx->stats_buffer.addr + \ | ||
215 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
216 | else if (FALCON_STAT_WIDTH(falcon_stat) == 32) \ | ||
217 | (efx)->mac_stats.efx_stat += le32_to_cpu( \ | ||
218 | *((__force __le32 *) \ | ||
219 | (efx->stats_buffer.addr + \ | ||
220 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
221 | else \ | ||
222 | (efx)->mac_stats.efx_stat += le64_to_cpu( \ | ||
223 | *((__force __le64 *) \ | ||
224 | (efx->stats_buffer.addr + \ | ||
225 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
226 | } while (0) | ||
227 | |||
228 | #define FALCON_MAC_STATS_SIZE 0x100 | ||
229 | |||
230 | #define MAC_DATA_LBN 0 | ||
231 | #define MAC_DATA_WIDTH 32 | ||
232 | |||
233 | extern void efx_nic_generate_event(struct efx_channel *channel, | ||
234 | efx_qword_t *event); | ||
235 | |||
236 | extern void falcon_poll_xmac(struct efx_nic *efx); | ||
237 | |||
238 | #endif /* EFX_NIC_H */ | ||