2  * drivers/net/ibm_emac/ibm_emac_core.h
 
   4  * Driver for PowerPC 4xx on-chip ethernet controller.
 
   6  * Copyright (c) 2004, 2005 Zultys Technologies.
 
   7  * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
 
   9  * Based on original work by
 
  10  *      Armin Kuster <akuster@mvista.com>
 
  11  *      Johnnie Peters <jpeters@mvista.com>
 
  12  *      Copyright 2000, 2001 MontaVista Softare Inc.
 
  14  * This program is free software; you can redistribute  it and/or modify it
 
  15  * under  the terms of  the GNU General  Public License as published by the
 
  16  * Free Software Foundation;  either version 2 of the  License, or (at your
 
  17  * option) any later version.
 
  20 #ifndef __IBM_EMAC_CORE_H_
 
  21 #define __IBM_EMAC_CORE_H_
 
  23 #include <linux/netdevice.h>
 
  24 #include <linux/dma-mapping.h>
 
  28 #include "ibm_emac_phy.h"
 
  29 #include "ibm_emac_zmii.h"
 
  30 #include "ibm_emac_rgmii.h"
 
  31 #include "ibm_emac_mal.h"
 
  32 #include "ibm_emac_tah.h"
 
  34 #define NUM_TX_BUFF                     CONFIG_IBM_EMAC_TXB
 
  35 #define NUM_RX_BUFF                     CONFIG_IBM_EMAC_RXB
 
  37 /* Simple sanity check */
 
  38 #if NUM_TX_BUFF > 256 || NUM_RX_BUFF > 256
 
  39 #error Invalid number of buffer descriptors (greater than 256)
 
  43 #define EMAC_MIN_MTU                    46
 
  44 #define EMAC_MAX_MTU                    9000
 
  46 /* Maximum L2 header length (VLAN tagged, no FCS) */
 
  47 #define EMAC_MTU_OVERHEAD               (6 * 2 + 2 + 4)
 
  49 /* RX BD size for the given MTU */
 
  50 static inline int emac_rx_size(int mtu)
 
  52         if (mtu > ETH_DATA_LEN)
 
  53                 return MAL_MAX_RX_SIZE;
 
  55                 return mal_rx_size(ETH_DATA_LEN + EMAC_MTU_OVERHEAD);
 
  58 #define EMAC_DMA_ALIGN(x)               ALIGN((x), dma_get_cache_alignment())
 
  60 #define EMAC_RX_SKB_HEADROOM            \
 
  61         EMAC_DMA_ALIGN(CONFIG_IBM_EMAC_RX_SKB_HEADROOM)
 
  63 /* Size of RX skb for the given MTU */
 
  64 static inline int emac_rx_skb_size(int mtu)
 
  66         int size = max(mtu + EMAC_MTU_OVERHEAD, emac_rx_size(mtu));
 
  67         return EMAC_DMA_ALIGN(size + 2) + EMAC_RX_SKB_HEADROOM;
 
  70 /* RX DMA sync size */
 
  71 static inline int emac_rx_sync_size(int mtu)
 
  73         return EMAC_DMA_ALIGN(emac_rx_size(mtu) + 2);
 
  76 /* Driver statistcs is split into two parts to make it more cache friendly:
 
  77  *   - normal statistics (packet count, etc)
 
  80  * When statistics is requested by ethtool, these parts are concatenated,
 
  81  * normal one goes first.
 
  83  * Please, keep these structures in sync with emac_stats_keys.
 
  86 /* Normal TX/RX Statistics */
 
  87 struct ibm_emac_stats {
 
  96 /* Error statistics */
 
  97 struct ibm_emac_error_stats {
 
 100         /* Software RX Errors */
 
 101         u64 rx_dropped_stack;
 
 103         u64 rx_dropped_error;
 
 104         u64 rx_dropped_resize;
 
 107         /* BD reported RX errors */
 
 110         u64 rx_bd_bad_packet;
 
 111         u64 rx_bd_runt_packet;
 
 112         u64 rx_bd_short_event;
 
 113         u64 rx_bd_alignment_error;
 
 115         u64 rx_bd_packet_too_long;
 
 116         u64 rx_bd_out_of_range;
 
 118         /* EMAC IRQ reported RX errors */
 
 125         u64 rx_alignment_error;
 
 127         u64 rx_packet_too_long;
 
 131         /* Software TX Errors */
 
 133         /* BD reported TX errors */
 
 136         u64 tx_bd_carrier_loss;
 
 137         u64 tx_bd_excessive_deferral;
 
 138         u64 tx_bd_excessive_collisions;
 
 139         u64 tx_bd_late_collision;
 
 140         u64 tx_bd_multple_collisions;
 
 141         u64 tx_bd_single_collision;
 
 144         /* EMAC IRQ reported TX errors */
 
 151 #define EMAC_ETHTOOL_STATS_COUNT        ((sizeof(struct ibm_emac_stats) + \
 
 152                                           sizeof(struct ibm_emac_error_stats)) \
 
 155 struct ocp_enet_private {
 
 156         struct net_device               *ndev;          /* 0 */
 
 157         struct emac_regs                __iomem *emacp;
 
 159         struct mal_descriptor           *tx_desc;
 
 164         struct mal_descriptor           *rx_desc;
 
 166         struct sk_buff                  *rx_sg_skb;     /* 1 */
 
 170         struct ibm_emac_stats           stats;
 
 171         struct ocp_device               *tah_dev;
 
 173         struct ibm_ocp_mal              *mal;
 
 174         struct mal_commac               commac;
 
 176         struct sk_buff                  *tx_skb[NUM_TX_BUFF];
 
 177         struct sk_buff                  *rx_skb[NUM_RX_BUFF];
 
 179         struct ocp_device               *zmii_dev;
 
 181         struct ocp_enet_private         *mdio_dev;
 
 182         struct ocp_device               *rgmii_dev;
 
 188         struct timer_list               link_timer;
 
 191         int                             stop_timeout;   /* in us */
 
 193         struct ibm_emac_error_stats     estats;
 
 194         struct net_device_stats         nstats;
 
 199 /* Ethtool get_regs complex data.
 
 200  * We want to get not just EMAC registers, but also MAL, ZMII, RGMII, TAH 
 
 203  * Returned BLOB consists of the ibm_emac_ethtool_regs_hdr, 
 
 204  * MAL registers, EMAC registers and optional ZMII, RGMII, TAH registers.
 
 205  * Each register component is preceded with emac_ethtool_regs_subhdr.
 
 206  * Order of the optional headers follows their relative bit posititions 
 
 207  * in emac_ethtool_regs_hdr.components
 
 209 #define EMAC_ETHTOOL_REGS_ZMII          0x00000001
 
 210 #define EMAC_ETHTOOL_REGS_RGMII         0x00000002
 
 211 #define EMAC_ETHTOOL_REGS_TAH           0x00000004
 
 213 struct emac_ethtool_regs_hdr {
 
 217 struct emac_ethtool_regs_subhdr {
 
 222 #endif                          /* __IBM_EMAC_CORE_H_ */