123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- /**************************************************************************
- *
- * GPL common net driver for Solarflare network cards
- *
- * Written by Michael Brown <mbrown@fensystems.co.uk>
- *
- * Copyright Fen Systems Ltd. 2005
- * Copyright Level 5 Networks Inc. 2005
- * Copyright Solarflare Communications Inc. 2013-2017
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * You can also choose to distribute this program under the terms of
- * the Unmodified Binary Distribution Licence (as given in the file
- * COPYING.UBDL), provided that you have satisfied its requirements.
- *
- ***************************************************************************/
- #ifndef EFX_COMMON_H
- #define EFX_COMMON_H
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #define __packed __attribute__((__packed__))
- #define __force /*nothing*/
-
- typedef uint16_t __le16;
- typedef uint32_t __le32;
- typedef uint64_t __le64;
-
- #define BUILD_BUG_ON_ZERO(e) (sizeof(struct{int: -!!(e); }))
- #define BUILD_BUG_ON(e) ((void)BUILD_BUG_ON_ZERO(e))
-
- #include <stdbool.h>
- #include <ipxe/io.h>
- #include <ipxe/netdevice.h>
- #include "efx_bitfield.h"
- #include "mcdi.h"
-
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
- #endif
-
- /**************************************************************************
- *
- * Hardware data structures and sizing
- *
- ***************************************************************************/
- typedef efx_qword_t efx_rx_desc_t;
- typedef efx_qword_t efx_tx_desc_t;
- typedef efx_qword_t efx_event_t;
-
- #define EFX_BUF_ALIGN 4096
- #define EFX_RXD_SIZE 512
- #define EFX_RXD_MASK (EFX_RXD_SIZE - 1)
- #define EFX_TXD_SIZE 512
- #define EFX_TXD_MASK (EFX_TXD_SIZE - 1)
- #define EFX_EVQ_SIZE 512
- #define EFX_EVQ_MASK (EFX_EVQ_SIZE - 1)
-
- /* There is space for 512 rx descriptors available. This number can be
- * anything between 1 and 512 in powers of 2. This value will affect the
- * network performance. During a test we were able to push 239 descriptors
- * before we ran out of space.
- */
- #define EFX_NUM_RX_DESC 64
- #define EFX_NUM_RX_DESC_MASK (EFX_NUM_RX_DESC - 1)
-
- /* The packet size is usually 1500 bytes hence we choose 1600 as the buf size,
- * which is (1500+metadata)
- */
- #define EFX_RX_BUF_SIZE 1600
-
- /* Settings for the state field in efx_nic.
- */
- #define EFX_STATE_POLLING 1
-
- typedef unsigned long long dma_addr_t;
-
- /** A buffer table allocation backing a tx dma, rx dma or eventq */
- struct efx_special_buffer {
- dma_addr_t dma_addr;
- int id;
- };
-
- /** A transmit queue */
- struct efx_tx_queue {
- /* The hardware ring */
- efx_tx_desc_t *ring;
-
- /* The software ring storing io_buffers. */
- struct io_buffer *buf[EFX_TXD_SIZE];
-
- /* The buffer table reservation pushed to hardware */
- struct efx_special_buffer entry;
-
- /* Software descriptor write ptr */
- unsigned int write_ptr;
-
- /* Hardware descriptor read ptr */
- unsigned int read_ptr;
- };
-
- /** A receive queue */
- struct efx_rx_queue {
- /* The hardware ring */
- efx_rx_desc_t *ring;
-
- /* The software ring storing io_buffers */
- struct io_buffer *buf[EFX_NUM_RX_DESC];
-
- /* The buffer table reservation pushed to hardware */
- struct efx_special_buffer entry;
-
- /* Descriptor write ptr, into both the hardware and software rings */
- unsigned int write_ptr;
-
- /* Hardware completion ptr */
- unsigned int read_ptr;
-
- /* The value of RX_CONT in the previous RX event */
- unsigned int rx_cont_prev;
- };
-
- /** An event queue */
- struct efx_ev_queue {
- /* The hardware ring to push to hardware.
- * Must be the first entry in the structure.
- */
- efx_event_t *ring;
-
- /* The buffer table reservation pushed to hardware */
- struct efx_special_buffer entry;
-
- /* Pointers into the ring */
- unsigned int read_ptr;
- };
-
- /* Hardware revisions */
- enum efx_revision {
- EFX_HUNTINGTON,
- };
-
- /** Hardware access */
- struct efx_nic {
- struct net_device *netdev;
- enum efx_revision revision;
- const struct efx_nic_type *type;
-
- int port;
- u32 state;
-
- /** Memory and IO base */
- void *membase;
- unsigned long mmio_start;
- unsigned long mmio_len;
-
- /* Buffer table allocation head */
- int buffer_head;
-
- /* Queues */
- struct efx_rx_queue rxq;
- struct efx_tx_queue txq;
- struct efx_ev_queue evq;
-
- unsigned int rx_prefix_size;
-
- /** INT_REG_KER */
- int int_en;
- efx_oword_t int_ker __aligned;
-
- /* Set to true if firmware supports the workaround for bug35388 */
- bool workaround_35388;
-
- };
-
-
- /** Efx device type definition */
- struct efx_nic_type {
- int (*mcdi_rpc)(struct efx_nic *efx, unsigned int cmd,
- const efx_dword_t *inbuf, size_t inlen,
- efx_dword_t *outbuf, size_t outlen,
- size_t *outlen_actual, bool quiet);
- };
-
- extern const struct efx_nic_type hunt_nic_type;
-
- #define EFX_MAC_FRAME_LEN(_mtu) \
- (((_mtu) \
- + /* EtherII already included */ \
- + 4 /* FCS */ \
- /* No VLAN supported */ \
- + 16 /* bug16772 */ \
- + 7) & ~7)
-
- /*******************************************************************************
- *
- *
- * Hardware API
- *
- *
- ******************************************************************************/
- static inline void _efx_writel(struct efx_nic *efx, uint32_t value,
- unsigned int reg)
- {
- writel((value), (efx)->membase + (reg));
- }
-
- static inline uint32_t _efx_readl(struct efx_nic *efx, unsigned int reg)
- {
- return readl((efx)->membase + (reg));
- }
-
- #define efx_writel_table(efx, value, index, reg) \
- efx_writel(efx, value, (reg) + ((index) * reg##_STEP))
-
- #define efx_writel_page(efx, value, index, reg) \
- efx_writel(efx, value, (reg) + ((index) * 0x2000))
-
- /* Hardware access */
- extern void efx_writel(struct efx_nic *efx, efx_dword_t *value,
- unsigned int reg);
- extern void efx_readl(struct efx_nic *efx, efx_dword_t *value,
- unsigned int reg);
-
- /* Initialisation */
- extern void efx_probe(struct net_device *netdev, enum efx_revision rev);
- extern void efx_remove(struct net_device *netdev);
-
- #endif /* EFX_COMMON_H */
|