These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / ethernet / freescale / gianfar.h
index daa1d37..cb77667 100644 (file)
@@ -71,11 +71,6 @@ struct ethtool_rx_list {
 /* Number of bytes to align the rx bufs to */
 #define RXBUF_ALIGNMENT 64
 
-/* The number of bytes which composes a unit for the purpose of
- * allocating data buffers.  ie-for any given MTU, the data buffer
- * will be the next highest multiple of 512 bytes. */
-#define INCREMENTAL_BUFFER_SIZE 512
-
 #define PHY_INIT_TIMEOUT 100000
 
 #define DRV_NAME "gfar-enet"
@@ -92,6 +87,8 @@ extern const char gfar_driver_version[];
 #define DEFAULT_TX_RING_SIZE   256
 #define DEFAULT_RX_RING_SIZE   256
 
+#define GFAR_RX_BUFF_ALLOC     16
+
 #define GFAR_RX_MAX_RING_SIZE   256
 #define GFAR_TX_MAX_RING_SIZE   256
 
@@ -103,11 +100,14 @@ extern const char gfar_driver_version[];
 #define DEFAULT_RX_LFC_THR  16
 #define DEFAULT_LFC_PTVVAL  4
 
-#define DEFAULT_RX_BUFFER_SIZE  1536
+#define GFAR_RXB_SIZE 1536
+#define GFAR_SKBFRAG_SIZE (RXBUF_ALIGNMENT + GFAR_RXB_SIZE \
+                         + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
+#define GFAR_RXB_TRUESIZE 2048
+
 #define TX_RING_MOD_MASK(size) (size-1)
 #define RX_RING_MOD_MASK(size) (size-1)
-#define JUMBO_BUFFER_SIZE 9728
-#define JUMBO_FRAME_SIZE 9600
+#define GFAR_JUMBO_FRAME_SIZE 9600
 
 #define DEFAULT_FIFO_TX_THR 0x100
 #define DEFAULT_FIFO_TX_STARVE 0x40
@@ -340,6 +340,7 @@ extern const char gfar_driver_version[];
 #define IEVENT_MAG             0x00000800
 #define IEVENT_GRSC            0x00000100
 #define IEVENT_RXF0            0x00000080
+#define IEVENT_FGPI            0x00000010
 #define IEVENT_FIR             0x00000008
 #define IEVENT_FIQ             0x00000004
 #define IEVENT_DPE             0x00000002
@@ -372,6 +373,7 @@ extern const char gfar_driver_version[];
 #define IMASK_MAG              0x00000800
 #define IMASK_GRSC              0x00000100
 #define IMASK_RXFEN0           0x00000080
+#define IMASK_FGPI             0x00000010
 #define IMASK_FIR              0x00000008
 #define IMASK_FIQ              0x00000004
 #define IMASK_DPE              0x00000002
@@ -540,6 +542,9 @@ extern const char gfar_driver_version[];
 
 #define GFAR_INT_NAME_MAX      (IFNAMSIZ + 6)  /* '_g#_xx' */
 
+#define GFAR_WOL_MAGIC         0x00000001
+#define GFAR_WOL_FILER_UCAST   0x00000002
+
 struct txbd8
 {
        union {
@@ -640,6 +645,7 @@ struct rmon_mib
 };
 
 struct gfar_extra_stats {
+       atomic64_t rx_alloc_err;
        atomic64_t rx_large;
        atomic64_t rx_short;
        atomic64_t rx_nonoctet;
@@ -651,7 +657,6 @@ struct gfar_extra_stats {
        atomic64_t eberr;
        atomic64_t tx_babt;
        atomic64_t tx_underrun;
-       atomic64_t rx_skbmissing;
        atomic64_t tx_timeout;
 };
 
@@ -917,6 +922,8 @@ struct gfar {
 #define FSL_GIANFAR_DEV_HAS_BD_STASHING                0x00000200
 #define FSL_GIANFAR_DEV_HAS_BUF_STASHING       0x00000400
 #define FSL_GIANFAR_DEV_HAS_TIMER              0x00000800
+#define FSL_GIANFAR_DEV_HAS_WAKE_ON_FILER      0x00001000
+#define FSL_GIANFAR_DEV_HAS_RX_FILER           0x00002000
 
 #if (MAXGROUPS == 2)
 #define DEFAULT_MAPPING        0xAA
@@ -1012,34 +1019,42 @@ struct rx_q_stats {
        unsigned long rx_dropped;
 };
 
+struct gfar_rx_buff {
+       dma_addr_t dma;
+       struct page *page;
+       unsigned int page_offset;
+};
+
 /**
  *     struct gfar_priv_rx_q - per rx queue structure
- *     @rx_skbuff: skb pointers
- *     @skb_currx: currently use skb pointer
+ *     @rx_buff: Array of buffer info metadata structs
  *     @rx_bd_base: First rx buffer descriptor
- *     @cur_rx: Next free rx ring entry
+ *     @next_to_use: index of the next buffer to be alloc'd
+ *     @next_to_clean: index of the next buffer to be cleaned
  *     @qindex: index of this queue
- *     @dev: back pointer to the dev structure
+ *     @ndev: back pointer to net_device
  *     @rx_ring_size: Rx ring size
  *     @rxcoalescing: enable/disable rx-coalescing
  *     @rxic: receive interrupt coalescing vlaue
  */
 
 struct gfar_priv_rx_q {
-       struct  sk_buff **rx_skbuff __aligned(SMP_CACHE_BYTES);
-       dma_addr_t rx_bd_dma_base;
+       struct  gfar_rx_buff *rx_buff __aligned(SMP_CACHE_BYTES);
        struct  rxbd8 *rx_bd_base;
-       struct  rxbd8 *cur_rx;
-       struct  net_device *dev;
-       struct gfar_priv_grp *grp;
+       struct  net_device *ndev;
+       struct  device *dev;
+       u16 rx_ring_size;
+       u16 qindex;
+       struct  gfar_priv_grp *grp;
+       u16 next_to_clean;
+       u16 next_to_use;
+       u16 next_to_alloc;
+       struct  sk_buff *skb;
        struct rx_q_stats stats;
-       u16     skb_currx;
-       u16     qindex;
-       unsigned int    rx_ring_size;
-       /* RX Coalescing values */
+       u32 __iomem *rfbptr;
        unsigned char rxcoalescing;
        unsigned long rxic;
-       u32 __iomem *rfbptr;
+       dma_addr_t rx_bd_dma_base;
 };
 
 enum gfar_irqinfo_id {
@@ -1109,7 +1124,6 @@ struct gfar_private {
        struct device *dev;
        struct net_device *ndev;
        enum gfar_errata errata;
-       unsigned int rx_buffer_size;
 
        u16 uses_rxfcb;
        u16 padding;
@@ -1145,9 +1159,6 @@ struct gfar_private {
        int oldduplex;
        int oldlink;
 
-       /* Bitfield update lock */
-       spinlock_t bflock;
-
        uint32_t msg_enable;
 
        struct work_struct reset_task;
@@ -1157,8 +1168,6 @@ struct gfar_private {
                extended_hash:1,
                bd_stash_en:1,
                rx_filer_enable:1,
-               /* Wake-on-LAN enabled */
-               wol_en:1,
                /* Enable priorty based Tx scheduling in Hw */
                prio_sched_en:1,
                /* Flow control flags */
@@ -1187,6 +1196,10 @@ struct gfar_private {
        u32 __iomem *hash_regs[16];
        int hash_width;
 
+       /* wake-on-lan settings */
+       u16 wol_opts;
+       u16 wol_supported;
+
        /*Filer table*/
        unsigned int ftp_rqfpr[MAX_FILER_IDX + 1];
        unsigned int ftp_rqfcr[MAX_FILER_IDX + 1];
@@ -1295,6 +1308,28 @@ static inline void gfar_clear_txbd_status(struct txbd8 *bdp)
        bdp->lstatus = cpu_to_be32(lstatus);
 }
 
+static inline int gfar_rxbd_unused(struct gfar_priv_rx_q *rxq)
+{
+       if (rxq->next_to_clean > rxq->next_to_use)
+               return rxq->next_to_clean - rxq->next_to_use - 1;
+
+       return rxq->rx_ring_size + rxq->next_to_clean - rxq->next_to_use - 1;
+}
+
+static inline u32 gfar_rxbd_dma_lastfree(struct gfar_priv_rx_q *rxq)
+{
+       struct rxbd8 *bdp;
+       u32 bdp_dma;
+       int i;
+
+       i = rxq->next_to_use ? rxq->next_to_use - 1 : rxq->rx_ring_size - 1;
+       bdp = &rxq->rx_bd_base[i];
+       bdp_dma = lower_32_bits(rxq->rx_bd_dma_base);
+       bdp_dma += (uintptr_t)bdp - (uintptr_t)rxq->rx_bd_base;
+
+       return bdp_dma;
+}
+
 irqreturn_t gfar_receive(int irq, void *dev_id);
 int startup_gfar(struct net_device *dev);
 void stop_gfar(struct net_device *dev);