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