1eef4f27bSRobert Mustacchi /*
2eef4f27bSRobert Mustacchi  * Copyright 2014-2017 Cavium, Inc.
3eef4f27bSRobert Mustacchi  * The contents of this file are subject to the terms of the Common Development
4eef4f27bSRobert Mustacchi  * and Distribution License, v.1,  (the "License").
5eef4f27bSRobert Mustacchi  *
6eef4f27bSRobert Mustacchi  * You may not use this file except in compliance with the License.
7eef4f27bSRobert Mustacchi  *
8eef4f27bSRobert Mustacchi  * You can obtain a copy of the License at available
9eef4f27bSRobert Mustacchi  * at http://opensource.org/licenses/CDDL-1.0
10eef4f27bSRobert Mustacchi  *
11eef4f27bSRobert Mustacchi  * See the License for the specific language governing permissions and
12eef4f27bSRobert Mustacchi  * limitations under the License.
13eef4f27bSRobert Mustacchi  */
14eef4f27bSRobert Mustacchi 
15eef4f27bSRobert Mustacchi #ifndef _LM_H
16eef4f27bSRobert Mustacchi #define _LM_H
17eef4f27bSRobert Mustacchi 
18eef4f27bSRobert Mustacchi #include "lm_defs.h"
19eef4f27bSRobert Mustacchi #include "listq.h"
20eef4f27bSRobert Mustacchi 
21eef4f27bSRobert Mustacchi 
22eef4f27bSRobert Mustacchi 
23eef4f27bSRobert Mustacchi /*******************************************************************************
24eef4f27bSRobert Mustacchi  * Constants.
25eef4f27bSRobert Mustacchi  ******************************************************************************/
26eef4f27bSRobert Mustacchi 
27eef4f27bSRobert Mustacchi #define BAD_DEFAULT_VALUE                   0xffffffff
28eef4f27bSRobert Mustacchi 
29eef4f27bSRobert Mustacchi #define ETHERNET_ADDRESS_SIZE               6
30eef4f27bSRobert Mustacchi #define ETHERNET_PACKET_HEADER_SIZE         14
31eef4f27bSRobert Mustacchi #define MIN_ETHERNET_PACKET_SIZE            60
32eef4f27bSRobert Mustacchi #define MAX_ETHERNET_PACKET_SIZE            1514
33eef4f27bSRobert Mustacchi #define MAX_ETHERNET_PACKET_BUFFER_SIZE     1536    /* A nice even number. */
34eef4f27bSRobert Mustacchi #define MIN_JMBO_ETHERNET_PACKET_SIZE       2014
35eef4f27bSRobert Mustacchi #define MAX_JMBO_ETHERNET_PACKET_SIZE       9014
36eef4f27bSRobert Mustacchi 
37eef4f27bSRobert Mustacchi 
38eef4f27bSRobert Mustacchi 
39eef4f27bSRobert Mustacchi /*******************************************************************************
40eef4f27bSRobert Mustacchi  * Forward definition.
41eef4f27bSRobert Mustacchi  ******************************************************************************/
42eef4f27bSRobert Mustacchi 
43eef4f27bSRobert Mustacchi /* Main device structure. */
44eef4f27bSRobert Mustacchi /* typedef struct _lm_device_t lm_device_t; */
45eef4f27bSRobert Mustacchi struct _lm_device_t;
46eef4f27bSRobert Mustacchi 
47eef4f27bSRobert Mustacchi /* Packet descriptor for sending/receiving packets. */
48eef4f27bSRobert Mustacchi /* typedef struct _lm_packet_t lm_packet_t; */
49eef4f27bSRobert Mustacchi struct _lm_packet_t;
50eef4f27bSRobert Mustacchi 
51eef4f27bSRobert Mustacchi 
52eef4f27bSRobert Mustacchi 
53eef4f27bSRobert Mustacchi /*******************************************************************************
54eef4f27bSRobert Mustacchi  * Mutlicast address table.
55eef4f27bSRobert Mustacchi  ******************************************************************************/
56eef4f27bSRobert Mustacchi 
57eef4f27bSRobert Mustacchi #ifndef LM_MAX_MC_TABLE_SIZE
58eef4f27bSRobert Mustacchi #define LM_MAX_MC_TABLE_SIZE                64
59eef4f27bSRobert Mustacchi #endif
60eef4f27bSRobert Mustacchi 
61eef4f27bSRobert Mustacchi typedef struct _lm_mc_entry_t
62eef4f27bSRobert Mustacchi {
63eef4f27bSRobert Mustacchi     u8_t mc_addr[ETHERNET_ADDRESS_SIZE];
64eef4f27bSRobert Mustacchi     u16_t ref_cnt;
65eef4f27bSRobert Mustacchi } lm_mc_entry_t;
66eef4f27bSRobert Mustacchi 
67eef4f27bSRobert Mustacchi typedef struct _lm_mc_table_t
68eef4f27bSRobert Mustacchi {
69eef4f27bSRobert Mustacchi     u32_t entry_cnt;
70eef4f27bSRobert Mustacchi     lm_mc_entry_t addr_arr[LM_MAX_MC_TABLE_SIZE];
71eef4f27bSRobert Mustacchi } lm_mc_table_t;
72eef4f27bSRobert Mustacchi 
73eef4f27bSRobert Mustacchi 
74eef4f27bSRobert Mustacchi 
75eef4f27bSRobert Mustacchi /*******************************************************************************
76eef4f27bSRobert Mustacchi  * Network wake-up frame.
77eef4f27bSRobert Mustacchi  ******************************************************************************/
78eef4f27bSRobert Mustacchi 
79eef4f27bSRobert Mustacchi #ifndef LM_NWUF_PATTERN_SIZE
80eef4f27bSRobert Mustacchi #define LM_NWUF_PATTERN_SIZE                    128
81eef4f27bSRobert Mustacchi #endif
82eef4f27bSRobert Mustacchi #define LM_NWUF_PATTERN_MASK_SIZE               (LM_NWUF_PATTERN_SIZE/8)
83eef4f27bSRobert Mustacchi 
84eef4f27bSRobert Mustacchi /* Wake-up frame pattern. */
85eef4f27bSRobert Mustacchi typedef struct _lm_nwuf_pattern_t
86eef4f27bSRobert Mustacchi {
87eef4f27bSRobert Mustacchi     u32_t size;         /* Mask size. */
88eef4f27bSRobert Mustacchi     u8_t mask[LM_NWUF_PATTERN_MASK_SIZE];
89eef4f27bSRobert Mustacchi     u8_t pattern[LM_NWUF_PATTERN_SIZE];
90eef4f27bSRobert Mustacchi } lm_nwuf_t;
91eef4f27bSRobert Mustacchi 
92eef4f27bSRobert Mustacchi 
93eef4f27bSRobert Mustacchi #ifndef LM_MAX_NWUF_CNT
94eef4f27bSRobert Mustacchi #define LM_MAX_NWUF_CNT                         7
95eef4f27bSRobert Mustacchi #endif
96eef4f27bSRobert Mustacchi 
97eef4f27bSRobert Mustacchi #ifndef LM_MAX_NWUF_CNT_5709
98eef4f27bSRobert Mustacchi #define LM_MAX_NWUF_CNT_5709                    8
99eef4f27bSRobert Mustacchi #endif
100eef4f27bSRobert Mustacchi 
101eef4f27bSRobert Mustacchi typedef struct _lm_nwuf_list_t
102eef4f27bSRobert Mustacchi {
103eef4f27bSRobert Mustacchi     lm_nwuf_t nwuf_arr[LM_MAX_NWUF_CNT_5709];
104eef4f27bSRobert Mustacchi     u32_t cnt;
105eef4f27bSRobert Mustacchi } lm_nwuf_list_t;
106eef4f27bSRobert Mustacchi 
107eef4f27bSRobert Mustacchi 
108eef4f27bSRobert Mustacchi 
109eef4f27bSRobert Mustacchi /*******************************************************************************
110eef4f27bSRobert Mustacchi  * Interrupts.
111eef4f27bSRobert Mustacchi  ******************************************************************************/
112eef4f27bSRobert Mustacchi 
113eef4f27bSRobert Mustacchi #define LM_NO_EVENT_ACTIVE                          0x00000000
114eef4f27bSRobert Mustacchi 
115eef4f27bSRobert Mustacchi #define LM_TX0_EVENT_BIT                            0
116eef4f27bSRobert Mustacchi 
117eef4f27bSRobert Mustacchi #define LM_TX0_EVENT_ACTIVE                         (1UL<<0)
118eef4f27bSRobert Mustacchi #define LM_TX1_EVENT_ACTIVE                         (1UL<<1)
119eef4f27bSRobert Mustacchi #define LM_TX2_EVENT_ACTIVE                         (1UL<<2)
120eef4f27bSRobert Mustacchi #define LM_TX3_EVENT_ACTIVE                         (1UL<<3)
121eef4f27bSRobert Mustacchi #define LM_TX4_EVENT_ACTIVE                         (1UL<<4)
122eef4f27bSRobert Mustacchi #define LM_TX5_EVENT_ACTIVE                         (1UL<<5)
123eef4f27bSRobert Mustacchi #define LM_TX6_EVENT_ACTIVE                         (1UL<<6)
124eef4f27bSRobert Mustacchi #define LM_TX7_EVENT_ACTIVE                         (1UL<<7)
125eef4f27bSRobert Mustacchi #define LM_TX8_EVENT_ACTIVE                         (1UL<<8)
126eef4f27bSRobert Mustacchi #define LM_TX9_EVENT_ACTIVE                         (1UL<<9)
127eef4f27bSRobert Mustacchi #define LM_TX10_EVENT_ACTIVE                        (1UL<<10)
128eef4f27bSRobert Mustacchi #define LM_TX11_EVENT_ACTIVE                        (1UL<<11)
129eef4f27bSRobert Mustacchi 
130eef4f27bSRobert Mustacchi #define LM_TX_EVENT_MASK                            0xfffUL
131eef4f27bSRobert Mustacchi 
132eef4f27bSRobert Mustacchi #define LM_RX0_EVENT_BIT                            16
133eef4f27bSRobert Mustacchi 
134eef4f27bSRobert Mustacchi #define LM_RX0_EVENT_ACTIVE                         (1UL<<16)
135eef4f27bSRobert Mustacchi #define LM_RX1_EVENT_ACTIVE                         (1UL<<17)
136eef4f27bSRobert Mustacchi #define LM_RX2_EVENT_ACTIVE                         (1UL<<18)
137eef4f27bSRobert Mustacchi #define LM_RX3_EVENT_ACTIVE                         (1UL<<19)
138eef4f27bSRobert Mustacchi #define LM_RX4_EVENT_ACTIVE                         (1UL<<20)
139eef4f27bSRobert Mustacchi #define LM_RX5_EVENT_ACTIVE                         (1UL<<21)
140eef4f27bSRobert Mustacchi #define LM_RX6_EVENT_ACTIVE                         (1UL<<22)
141eef4f27bSRobert Mustacchi #define LM_RX7_EVENT_ACTIVE                         (1UL<<23)
142eef4f27bSRobert Mustacchi #define LM_RX8_EVENT_ACTIVE                         (1UL<<24)
143eef4f27bSRobert Mustacchi #define LM_RX9_EVENT_ACTIVE                         (1UL<<25)
144eef4f27bSRobert Mustacchi #define LM_RX10_EVENT_ACTIVE                        (1UL<<26)
145eef4f27bSRobert Mustacchi #define LM_RX11_EVENT_ACTIVE                        (1UL<<27)
146eef4f27bSRobert Mustacchi 
147eef4f27bSRobert Mustacchi #define LM_RX_EVENT_MASK                            0xfff0000UL
148eef4f27bSRobert Mustacchi 
149eef4f27bSRobert Mustacchi #define LM_PHY_CONFIG_CHANGED                       (1UL<<13)
150eef4f27bSRobert Mustacchi #define LM_KWQ_EVENT_ACTIVE                         (1UL<<14)
151eef4f27bSRobert Mustacchi #define LM_KCQ_EVENT_ACTIVE                         (1UL<<15)
152eef4f27bSRobert Mustacchi #define LM_PHY_EVENT_ACTIVE                         (1UL<<30)
153eef4f27bSRobert Mustacchi #define LM_KNOCK_KNOCK_EVENT                        (1UL<<31)
154eef4f27bSRobert Mustacchi 
155eef4f27bSRobert Mustacchi typedef u32_t lm_interrupt_status_t;
156eef4f27bSRobert Mustacchi 
157eef4f27bSRobert Mustacchi 
158eef4f27bSRobert Mustacchi 
159eef4f27bSRobert Mustacchi /*******************************************************************************
160eef4f27bSRobert Mustacchi  * Function prototypes.
161eef4f27bSRobert Mustacchi  ******************************************************************************/
162eef4f27bSRobert Mustacchi 
163eef4f27bSRobert Mustacchi /* Description:
164*55fea89dSDan Cross  *    1.  Retrieves the adapter information, such as IRQ, BAR, chip
165*55fea89dSDan Cross  *        IDs, MAC address, etc.
166*55fea89dSDan Cross  *    2.  Maps the BAR to system address space so hardware registers are
167*55fea89dSDan Cross  *        accessible.
168*55fea89dSDan Cross  *    3.  Initializes the default parameters in 'pdev'.
169*55fea89dSDan Cross  *    4.  Reads user configurations.
170eef4f27bSRobert Mustacchi  *    5.  Resets the transceiver.
171*55fea89dSDan Cross  * This routine calls the following mm routines:
172eef4f27bSRobert Mustacchi  *    mm_map_io_base, mm_get_user_config. */
173eef4f27bSRobert Mustacchi lm_status_t
174eef4f27bSRobert Mustacchi lm_get_dev_info(
175eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
176eef4f27bSRobert Mustacchi 
177eef4f27bSRobert Mustacchi /* Description:
178*55fea89dSDan Cross  *    This routine is called during driver initialization.  It is responsible
179eef4f27bSRobert Mustacchi  *    for allocating memory resources needed by the driver.  Packet
180eef4f27bSRobert Mustacchi  *    descriptors are allocated here and put into various queues.  OS
181*55fea89dSDan Cross  *    independent initialization of packets descriptors are done here and
182eef4f27bSRobert Mustacchi  *    finished up in mm_init_packet_desc.
183*55fea89dSDan Cross  * This routine calls the following mm routines:
184eef4f27bSRobert Mustacchi  *    mm_alloc_mem, mm_alloc_phys_mem, and mm_init_packet_desc. */
185eef4f27bSRobert Mustacchi lm_status_t
186eef4f27bSRobert Mustacchi lm_init_resc(
187eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
188eef4f27bSRobert Mustacchi 
189eef4f27bSRobert Mustacchi /* Description:
190*55fea89dSDan Cross  *    This routine is responsible for stopping the hardware from running,
191*55fea89dSDan Cross  *    cleaning up various request queues, aborting transmit requests, and
192eef4f27bSRobert Mustacchi  *    reclaiming all the receive buffers.
193eef4f27bSRobert Mustacchi  * This routine calls the following mm routines:
194eef4f27bSRobert Mustacchi  *    mm_indicate_tx, mm_free_rx_buf. */
195eef4f27bSRobert Mustacchi void
196eef4f27bSRobert Mustacchi lm_abort(
197eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
198eef4f27bSRobert Mustacchi     u32_t abort_op,
199eef4f27bSRobert Mustacchi     u32_t idx);
200eef4f27bSRobert Mustacchi #define ABORT_OP_RX_CHAIN               1
201eef4f27bSRobert Mustacchi #define ABORT_OP_TX_CHAIN               2
202eef4f27bSRobert Mustacchi 
203eef4f27bSRobert Mustacchi void
204eef4f27bSRobert Mustacchi lm_recv_abort(
205eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
206eef4f27bSRobert Mustacchi     u32_t idx);
207eef4f27bSRobert Mustacchi 
208eef4f27bSRobert Mustacchi void
209eef4f27bSRobert Mustacchi lm_send_abort(
210eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
211eef4f27bSRobert Mustacchi     u32_t idx);
212eef4f27bSRobert Mustacchi 
213eef4f27bSRobert Mustacchi /* Description:
214eef4f27bSRobert Mustacchi  *    This routine is called to initialize the first stage of reset which
215eef4f27bSRobert Mustacchi  *    only initializes all the device configurations; however states machines
216eef4f27bSRobert Mustacchi  *    if any, are not enabled yet. */
217eef4f27bSRobert Mustacchi lm_status_t
218eef4f27bSRobert Mustacchi lm_reset_setup(
219eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
220eef4f27bSRobert Mustacchi     u32_t reset_reason);
221eef4f27bSRobert Mustacchi 
222eef4f27bSRobert Mustacchi /* Description:
223eef4f27bSRobert Mustacchi  *    This routine finishes up the final stage of reset.  Various state
224eef4f27bSRobert Mustacchi  *    machines are enabled here.  Upon exit, interrupt will not yet enabled
225*55fea89dSDan Cross  *    and receive buffers are not queued.  However, the chip is initialized
226eef4f27bSRobert Mustacchi  *    and is ready to send and receive packets.
227eef4f27bSRobert Mustacchi  *    receive buffers are not queued. */
228eef4f27bSRobert Mustacchi lm_status_t
229eef4f27bSRobert Mustacchi lm_reset_run(
230eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
231eef4f27bSRobert Mustacchi 
232eef4f27bSRobert Mustacchi /* Description:
233eef4f27bSRobert Mustacchi  *    The main function of this routine is to reset and initialize the
234eef4f27bSRobert Mustacchi  *    hardware.  Upon exit, interrupt generation is not enable; however,
235eef4f27bSRobert Mustacchi  *    the hardware is ready to accept transmit requests and receive receive
236*55fea89dSDan Cross  *    packets.  'lm_abort' must be called prior to calling 'lm_reset'.
237eef4f27bSRobert Mustacchi  *    This routine is a wrapper for lm_reset_setup and lm_reset_run. */
238eef4f27bSRobert Mustacchi lm_status_t
239eef4f27bSRobert Mustacchi lm_reset(
240eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
241eef4f27bSRobert Mustacchi     u32_t reset_reason);
242eef4f27bSRobert Mustacchi 
243eef4f27bSRobert Mustacchi /* Description:
244*55fea89dSDan Cross  *    The main responsibility of this routine is to gracefully restore the
245eef4f27bSRobert Mustacchi  *    chip to its initial power-on state. */
246eef4f27bSRobert Mustacchi void
247eef4f27bSRobert Mustacchi lm_chip_reset(
248eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
249eef4f27bSRobert Mustacchi     lm_reason_t reason);
250eef4f27bSRobert Mustacchi 
251eef4f27bSRobert Mustacchi /* Description:
252eef4f27bSRobert Mustacchi  *    This routine post the indicate buffer or receive buffers in the
253eef4f27bSRobert Mustacchi  *    free buffer pool.  If 'packet' is null, all buffers in the free poll
254eef4f27bSRobert Mustacchi  *    will be posted; otherwise, only the 'packet' will be posted. */
255eef4f27bSRobert Mustacchi #if defined(LM_NON_LEGACY_MODE_SUPPORT)
256eef4f27bSRobert Mustacchi u32_t
257eef4f27bSRobert Mustacchi lm_post_buffers(
258eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
259eef4f27bSRobert Mustacchi     u32_t chain_idx,
260eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet,
261*55fea89dSDan Cross     lm_frag_list_t *frags);
262eef4f27bSRobert Mustacchi #else
263eef4f27bSRobert Mustacchi u32_t
264eef4f27bSRobert Mustacchi lm_post_buffers(
265eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
266eef4f27bSRobert Mustacchi     u32_t chain_idx,
267eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet);
268eef4f27bSRobert Mustacchi #endif
269eef4f27bSRobert Mustacchi /* Description:
270eef4f27bSRobert Mustacchi  *    This routine sends the given packet.  Resources required to send this
271eef4f27bSRobert Mustacchi  *    must have already been reserved.  The upper moduel is resposible for
272eef4f27bSRobert Mustacchi  *    any necessary queueing. */
273eef4f27bSRobert Mustacchi lm_status_t
274eef4f27bSRobert Mustacchi lm_send_packet(
275eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
276eef4f27bSRobert Mustacchi     u32_t chain_idx,
277eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet,
278eef4f27bSRobert Mustacchi     lm_frag_list_t *frags);
279eef4f27bSRobert Mustacchi 
280*55fea89dSDan Cross /* Description:
281eef4f27bSRobert Mustacchi  *    This routine is called to get all pending interrupts. */
282eef4f27bSRobert Mustacchi lm_interrupt_status_t
283eef4f27bSRobert Mustacchi lm_get_interrupt_status(
284eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
285eef4f27bSRobert Mustacchi 
286*55fea89dSDan Cross /* Description:
287eef4f27bSRobert Mustacchi  *    This routine is called to service receive interrupts.
288eef4f27bSRobert Mustacchi  * This routine calls the following mm routines:
289eef4f27bSRobert Mustacchi  *    mm_indicate_rx */
290eef4f27bSRobert Mustacchi void
291eef4f27bSRobert Mustacchi lm_service_rx_int(
292eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
293eef4f27bSRobert Mustacchi     u32_t chain_idx);
294eef4f27bSRobert Mustacchi 
295eef4f27bSRobert Mustacchi u32_t
296eef4f27bSRobert Mustacchi lm_get_packets_rcvd(
297eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
298eef4f27bSRobert Mustacchi     u32_t qidx,
299eef4f27bSRobert Mustacchi     u32_t con_idx,
300eef4f27bSRobert Mustacchi     s_list_t *rcvd_list);
301eef4f27bSRobert Mustacchi 
302eef4f27bSRobert Mustacchi 
303eef4f27bSRobert Mustacchi /* Description:
304eef4f27bSRobert Mustacchi  *    This routine is called to service transmit complete interrupts.
305eef4f27bSRobert Mustacchi  * This routine calls the following mm routines:
306eef4f27bSRobert Mustacchi  *    mm_indicate_tx, mm_complete_tx. */
307eef4f27bSRobert Mustacchi void
308eef4f27bSRobert Mustacchi lm_service_tx_int(
309eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
310eef4f27bSRobert Mustacchi     u32_t chain_idx);
311eef4f27bSRobert Mustacchi 
312eef4f27bSRobert Mustacchi u32_t
313eef4f27bSRobert Mustacchi lm_get_packets_sent(
314eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
315eef4f27bSRobert Mustacchi     u32_t qidx,
316eef4f27bSRobert Mustacchi     u32_t con_idx,
317eef4f27bSRobert Mustacchi     s_list_t *sent_list);
318eef4f27bSRobert Mustacchi 
319eef4f27bSRobert Mustacchi 
320eef4f27bSRobert Mustacchi /* Description:
321*55fea89dSDan Cross  *    This routine is called to service PHY interrupt.
322eef4f27bSRobert Mustacchi  * This routine calls the following mm routines:
323eef4f27bSRobert Mustacchi  *    mm_indicate_link */
324eef4f27bSRobert Mustacchi void
325eef4f27bSRobert Mustacchi lm_service_phy_int(
326eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
327eef4f27bSRobert Mustacchi     u32_t force_service_int);
328eef4f27bSRobert Mustacchi 
329*55fea89dSDan Cross /* Description:
330eef4f27bSRobert Mustacchi  *    This routine is called to mask out interrupt from the hardware. */
331eef4f27bSRobert Mustacchi void
332eef4f27bSRobert Mustacchi lm_disable_int(
333eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
334eef4f27bSRobert Mustacchi 
335eef4f27bSRobert Mustacchi /* Description:
336eef4f27bSRobert Mustacchi  *    This routine is called to enable interrupt generation. */
337eef4f27bSRobert Mustacchi void
338eef4f27bSRobert Mustacchi lm_enable_int(
339eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
340eef4f27bSRobert Mustacchi 
341eef4f27bSRobert Mustacchi /* Description:
342eef4f27bSRobert Mustacchi  *    This routine is called to set the receive filter. */
343eef4f27bSRobert Mustacchi lm_status_t
344eef4f27bSRobert Mustacchi lm_set_rx_mask(
345eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
346eef4f27bSRobert Mustacchi     u32_t user_idx,
347eef4f27bSRobert Mustacchi     lm_rx_mask_t rx_mask);
348eef4f27bSRobert Mustacchi 
349eef4f27bSRobert Mustacchi /* Description:
350*55fea89dSDan Cross  *    This routine is called to add a multicast address to the multicast
351*55fea89dSDan Cross  *    address table.  Multicast filtering is enabled independently via
352eef4f27bSRobert Mustacchi  *    lm_set_rx_mask call. */
353eef4f27bSRobert Mustacchi lm_status_t
354eef4f27bSRobert Mustacchi lm_add_mc(
355eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
356eef4f27bSRobert Mustacchi     u8_t *mc_addr);
357eef4f27bSRobert Mustacchi 
358eef4f27bSRobert Mustacchi /* Description:
359eef4f27bSRobert Mustacchi  *    This routine is called to remove a multicast address from the multicast
360eef4f27bSRobert Mustacchi  *    address table.  Multicast filtering is enabled independently via
361eef4f27bSRobert Mustacchi  *    lm_set_rx_mask call. */
362eef4f27bSRobert Mustacchi lm_status_t
363eef4f27bSRobert Mustacchi lm_del_mc(
364eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
365eef4f27bSRobert Mustacchi     u8_t *mc_addr);
366eef4f27bSRobert Mustacchi 
367eef4f27bSRobert Mustacchi /* Description:
368eef4f27bSRobert Mustacchi  *    This routine is called to remove all multicast addresses from the
369eef4f27bSRobert Mustacchi  *    multicast address table.  Multicast filtering is enabled independently
370eef4f27bSRobert Mustacchi  *    via lm_set_rx_mask call. */
371eef4f27bSRobert Mustacchi void
372eef4f27bSRobert Mustacchi lm_clear_mc(
373eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
374eef4f27bSRobert Mustacchi 
375*55fea89dSDan Cross /* Description:
376*55fea89dSDan Cross  *    This routine is called to set the current MAC address.  The 'addr_idx'
377*55fea89dSDan Cross  *    allows the caller to set multiple MAC addresses if the hardware is
378eef4f27bSRobert Mustacchi  *    capable of filtering multiple unicast addresses. */
379eef4f27bSRobert Mustacchi lm_status_t
380eef4f27bSRobert Mustacchi lm_set_mac_addr(
381eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
382eef4f27bSRobert Mustacchi     u32_t addr_idx,   /* zero based address index. */
383eef4f27bSRobert Mustacchi     u8_t *mac_addr);
384eef4f27bSRobert Mustacchi 
385eef4f27bSRobert Mustacchi /* Description:
386eef4f27bSRobert Mustacchi  *    This routine is called to retrieve statistics.  */
387eef4f27bSRobert Mustacchi lm_status_t
388eef4f27bSRobert Mustacchi lm_get_stats(
389eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
390eef4f27bSRobert Mustacchi     lm_stats_t stats_type,
391eef4f27bSRobert Mustacchi     u64_t *stats_cnt);
392eef4f27bSRobert Mustacchi 
393eef4f27bSRobert Mustacchi /* Description:
394eef4f27bSRobert Mustacchi  *    This routine is called to add a wake-up pattern to the main list that
395eef4f27bSRobert Mustacchi  *    contains all the wake-up frame. */
396eef4f27bSRobert Mustacchi lm_status_t
397eef4f27bSRobert Mustacchi lm_add_nwuf(
398eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
399eef4f27bSRobert Mustacchi     u32_t byte_pattern_size,
400eef4f27bSRobert Mustacchi     u32_t byte_mask_size,
401eef4f27bSRobert Mustacchi     u8_t *byte_mask,
402eef4f27bSRobert Mustacchi     u8_t *byte_pattern);
403eef4f27bSRobert Mustacchi 
404*55fea89dSDan Cross /* Description:
405eef4f27bSRobert Mustacchi  *    This routine is called to remove the wake-up pattern from the main list
406eef4f27bSRobert Mustacchi  *    that contains all the wake-up frame. */
407eef4f27bSRobert Mustacchi lm_status_t
408eef4f27bSRobert Mustacchi lm_del_nwuf(
409eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
410eef4f27bSRobert Mustacchi     u32_t byte_mask_size,
411eef4f27bSRobert Mustacchi     u8_t *byte_mask,
412eef4f27bSRobert Mustacchi     u8_t *byte_pattern);
413eef4f27bSRobert Mustacchi 
414eef4f27bSRobert Mustacchi /* Description:
415eef4f27bSRobert Mustacchi  *    Delete all the NWUF entries. */
416eef4f27bSRobert Mustacchi void
417eef4f27bSRobert Mustacchi lm_clear_nwuf(
418eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
419eef4f27bSRobert Mustacchi 
420eef4f27bSRobert Mustacchi 
421eef4f27bSRobert Mustacchi /* Description:
422eef4f27bSRobert Mustacchi  *    This routine is called to set up the device power state. */
423eef4f27bSRobert Mustacchi void
424eef4f27bSRobert Mustacchi lm_set_power_state(
425eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
426eef4f27bSRobert Mustacchi     lm_power_state_t power_state,
427eef4f27bSRobert Mustacchi     lm_wake_up_mode_t wake_up_mode,     /* Valid when power_state is D3. */
428eef4f27bSRobert Mustacchi     u8_t set_pci_pm);
429eef4f27bSRobert Mustacchi 
430eef4f27bSRobert Mustacchi /* Description:
431eef4f27bSRobert Mustacchi  *    This routine is called to initialize the PHY based one 'media_type'
432eef4f27bSRobert Mustacchi  *    setting.  'wait_for_link_timeout' specifies how long to poll for
433eef4f27bSRobert Mustacchi  *    link before returning. */
434eef4f27bSRobert Mustacchi lm_status_t
435eef4f27bSRobert Mustacchi lm_init_phy(
436eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
437eef4f27bSRobert Mustacchi     lm_medium_t req_medium,
438eef4f27bSRobert Mustacchi     lm_flow_control_t flow_control,
439eef4f27bSRobert Mustacchi     u32_t selective_autoneg,
440eef4f27bSRobert Mustacchi     u32_t wire_speed,
441eef4f27bSRobert Mustacchi     u32_t wait_for_link_timeout);
442eef4f27bSRobert Mustacchi 
443eef4f27bSRobert Mustacchi u8_t lm_is_mmio_ok(struct _lm_device_t *pdev);
444eef4f27bSRobert Mustacchi 
445eef4f27bSRobert Mustacchi #if INCLUDE_OFLD_SUPPORT
446eef4f27bSRobert Mustacchi void
447eef4f27bSRobert Mustacchi lm_get_ooo_pkts_rcvd(
448eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
449eef4f27bSRobert Mustacchi     struct _lm_rx_chain_t *rxq,
450eef4f27bSRobert Mustacchi     u32_t con_idx,
451eef4f27bSRobert Mustacchi     s_list_t *rx_done_list);
452eef4f27bSRobert Mustacchi #endif
453eef4f27bSRobert Mustacchi 
454eef4f27bSRobert Mustacchi /*******************************************************************************
455eef4f27bSRobert Mustacchi  * OS dependent functions called by the 'lm' routines.
456eef4f27bSRobert Mustacchi  ******************************************************************************/
457eef4f27bSRobert Mustacchi 
458eef4f27bSRobert Mustacchi /* Busy delay for the specified microseconds. */
459eef4f27bSRobert Mustacchi void
460eef4f27bSRobert Mustacchi mm_wait(
461eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
462eef4f27bSRobert Mustacchi     u32_t delay_us);
463eef4f27bSRobert Mustacchi 
464eef4f27bSRobert Mustacchi /* This routine is called to read a PCI configuration register.  The register
465eef4f27bSRobert Mustacchi  * must be 32-bit aligned. */
466eef4f27bSRobert Mustacchi lm_status_t
467eef4f27bSRobert Mustacchi mm_read_pci(
468eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
469eef4f27bSRobert Mustacchi     u32_t pci_reg,
470eef4f27bSRobert Mustacchi     u32_t *reg_value);
471eef4f27bSRobert Mustacchi 
472*55fea89dSDan Cross /* This routine is called to write a PCI configuration register.  The
473eef4f27bSRobert Mustacchi  * register must be 32-bit aligned. */
474eef4f27bSRobert Mustacchi lm_status_t
475eef4f27bSRobert Mustacchi mm_write_pci(
476eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
477eef4f27bSRobert Mustacchi     u32_t pci_reg,
478eef4f27bSRobert Mustacchi     u32_t reg_value);
479eef4f27bSRobert Mustacchi 
480eef4f27bSRobert Mustacchi /* This routine is called to map the base address of the device registers
481eef4f27bSRobert Mustacchi  * to system address space so that registers are accessible.  The base
482eef4f27bSRobert Mustacchi  * address will be unmapped when the driver unloads. */
483eef4f27bSRobert Mustacchi void *
484eef4f27bSRobert Mustacchi mm_map_io_base(
485eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
486eef4f27bSRobert Mustacchi     lm_address_t base_addr,
487eef4f27bSRobert Mustacchi     u32_t size);
488eef4f27bSRobert Mustacchi 
489eef4f27bSRobert Mustacchi /* This routine is called to read driver configuration.  It is called from
490eef4f27bSRobert Mustacchi  * lm_get_dev_info. */
491eef4f27bSRobert Mustacchi lm_status_t
492eef4f27bSRobert Mustacchi mm_get_user_config(
493eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
494eef4f27bSRobert Mustacchi 
495eef4f27bSRobert Mustacchi /* This routine returns the size of a packet descriptor. */
496eef4f27bSRobert Mustacchi u32_t
497eef4f27bSRobert Mustacchi mm_desc_size(
498eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
499eef4f27bSRobert Mustacchi     u32_t desc_type);
500eef4f27bSRobert Mustacchi #define DESC_TYPE_L2TX_PACKET           0
501eef4f27bSRobert Mustacchi #define DESC_TYPE_L2RX_PACKET           1
502eef4f27bSRobert Mustacchi 
503eef4f27bSRobert Mustacchi /* This routine is responsible for allocating system memory and keeping track
504eef4f27bSRobert Mustacchi  * of it.  The memory will be freed later when the driver unloads.  This
505eef4f27bSRobert Mustacchi  * routine is called during driver initialization. */
506eef4f27bSRobert Mustacchi void *
507eef4f27bSRobert Mustacchi mm_alloc_mem(
508eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
509eef4f27bSRobert Mustacchi     u32_t mem_size,
510eef4f27bSRobert Mustacchi     void *resc_list);
511eef4f27bSRobert Mustacchi 
512eef4f27bSRobert Mustacchi /* This routine is responsible for physical memory and keeping track
513eef4f27bSRobert Mustacchi  * of it.  The memory will be freed later when the driver unloads. */
514eef4f27bSRobert Mustacchi void *
515eef4f27bSRobert Mustacchi mm_alloc_phys_mem(
516eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
517eef4f27bSRobert Mustacchi     u32_t mem_size,
518eef4f27bSRobert Mustacchi     lm_address_t *phys_mem,
519eef4f27bSRobert Mustacchi     u8_t mem_type,
520eef4f27bSRobert Mustacchi     void *resc_list);
521eef4f27bSRobert Mustacchi #define PHYS_MEM_TYPE_UNSPECIFIED       0
522eef4f27bSRobert Mustacchi #define PHYS_MEM_TYPE_NONCACHED         1
523eef4f27bSRobert Mustacchi 
524eef4f27bSRobert Mustacchi 
525eef4f27bSRobert Mustacchi /* This routine flushes a memory block from caches of all processors. */
526eef4f27bSRobert Mustacchi //#if defined(_X86_) || defined(_AMD64_)
527eef4f27bSRobert Mustacchi #define mm_flush_cache(_pdev, _mem_virt, _mem_phy, _mem_size, _flush_type)
528eef4f27bSRobert Mustacchi //#else
529eef4f27bSRobert Mustacchi //void
530eef4f27bSRobert Mustacchi //mm_flush_cache(
531eef4f27bSRobert Mustacchi //    struct _lm_device_t *pdev,
532eef4f27bSRobert Mustacchi //    u8_t *mem_virt,
533eef4f27bSRobert Mustacchi //    lm_address_t mem_phy,
534eef4f27bSRobert Mustacchi //    u32_t mem_size,
535eef4f27bSRobert Mustacchi //    u8_t flush_type);
536eef4f27bSRobert Mustacchi //#define FLUSH_CACHE_BEFORE_DMA_READ     0
537eef4f27bSRobert Mustacchi //#define FLUSH_CACHE_AFTER_DMA_WRITE     1
538eef4f27bSRobert Mustacchi //#endif
539eef4f27bSRobert Mustacchi 
540eef4f27bSRobert Mustacchi 
541*55fea89dSDan Cross /* This routine is called to indicate completion of a transmit request.
542eef4f27bSRobert Mustacchi  * If 'packet' is not NULL, all the packets in the completion queue will be
543eef4f27bSRobert Mustacchi  * indicated.  Otherwise, only 'packet' will be indicated. */
544eef4f27bSRobert Mustacchi void
545eef4f27bSRobert Mustacchi mm_indicate_tx(
546eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
547eef4f27bSRobert Mustacchi     u32_t chain_idx,
548eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet_arr[],
549eef4f27bSRobert Mustacchi     u32_t num_packets);
550eef4f27bSRobert Mustacchi 
551eef4f27bSRobert Mustacchi /* This routine is called to indicate received packets.  If 'packet' is not
552eef4f27bSRobert Mustacchi  * NULL, all the packets in the received queue will be indicated.  Otherwise,
553eef4f27bSRobert Mustacchi  * only 'packet' will be indicated. */
554eef4f27bSRobert Mustacchi #if defined(LM_NON_LEGACY_MODE_SUPPORT)
555eef4f27bSRobert Mustacchi void
556eef4f27bSRobert Mustacchi mm_indicate_rx(
557eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
558eef4f27bSRobert Mustacchi     u32_t chain_idx,
559eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet_arr[],
560eef4f27bSRobert Mustacchi     u32_t num_packets,
561eef4f27bSRobert Mustacchi     u8_t ind_as_resc);
562eef4f27bSRobert Mustacchi #else
563eef4f27bSRobert Mustacchi void
564eef4f27bSRobert Mustacchi mm_indicate_rx(
565eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
566eef4f27bSRobert Mustacchi     u32_t chain_idx,
567eef4f27bSRobert Mustacchi     struct _lm_packet_t *packet_arr[],
568eef4f27bSRobert Mustacchi     u32_t num_packets);
569eef4f27bSRobert Mustacchi #endif
570eef4f27bSRobert Mustacchi 
571eef4f27bSRobert Mustacchi #if INCLUDE_OFLD_SUPPORT
572eef4f27bSRobert Mustacchi void
573eef4f27bSRobert Mustacchi mm_return_ooo_pkts(
574eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
575eef4f27bSRobert Mustacchi     u32_t       qidx,
576eef4f27bSRobert Mustacchi     s_list_t    *rcvd_list,
577eef4f27bSRobert Mustacchi     u32_t       l2pkt_type
578eef4f27bSRobert Mustacchi     );
579eef4f27bSRobert Mustacchi #endif
580eef4f27bSRobert Mustacchi 
581eef4f27bSRobert Mustacchi /* lm_service_phy_int calls this routine to indicate the current link. */
582eef4f27bSRobert Mustacchi void
583eef4f27bSRobert Mustacchi mm_indicate_link(
584eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
585eef4f27bSRobert Mustacchi     lm_status_t link,
586eef4f27bSRobert Mustacchi     lm_medium_t medium);
587eef4f27bSRobert Mustacchi 
588eef4f27bSRobert Mustacchi /* indirect register access lock. */
589eef4f27bSRobert Mustacchi void
590eef4f27bSRobert Mustacchi mm_acquire_ind_reg_lock(
591eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
592eef4f27bSRobert Mustacchi 
593eef4f27bSRobert Mustacchi void
594eef4f27bSRobert Mustacchi mm_release_ind_reg_lock(
595eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev);
596eef4f27bSRobert Mustacchi 
597eef4f27bSRobert Mustacchi void
598eef4f27bSRobert Mustacchi mm_comp_l2_filter_chng_req(
599eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
600eef4f27bSRobert Mustacchi     lm_status_t lm_status,
601eef4f27bSRobert Mustacchi     u32_t       q_grp_id);
602eef4f27bSRobert Mustacchi 
603eef4f27bSRobert Mustacchi void
604eef4f27bSRobert Mustacchi mm_q_grp_abort_rx_request(
605eef4f27bSRobert Mustacchi     struct _lm_device_t *pdev,
606eef4f27bSRobert Mustacchi     u32_t       qidx);
607eef4f27bSRobert Mustacchi 
608eef4f27bSRobert Mustacchi 
609eef4f27bSRobert Mustacchi #endif /* _LM_H */
610eef4f27bSRobert Mustacchi 
611