2009-10-15 02:13:45 +04:00
/*******************************************************************************
STMMAC Common Header File
Copyright ( C ) 2007 - 2009 STMicroelectronics Ltd
This program is free software ; you can redistribute it and / or modify it
under the terms and conditions of the GNU General Public License ,
version 2 , as published by the Free Software Foundation .
This program is distributed in the hope it will be useful , but WITHOUT
ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
more details .
You should have received a copy of the GNU General Public License along with
this program ; if not , write to the Free Software Foundation , Inc . ,
51 Franklin St - Fifth Floor , Boston , MA 02110 - 1301 USA .
The full GNU General Public License is included in this distribution in
the file called " COPYING " .
Author : Giuseppe Cavallaro < peppe . cavallaro @ st . com >
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-01-07 02:07:21 +03:00
# include <linux/netdevice.h>
2010-04-14 00:21:16 +04:00
# if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
# define STMMAC_VLAN_TAG_USED
# include <linux/if_vlan.h>
# endif
2010-04-14 00:21:12 +04:00
# include "descs.h"
# undef CHIP_DEBUG_PRINT
/* Turn-on extra printk debug for MAC core, dma and descriptors */
/* #define CHIP_DEBUG_PRINT */
# ifdef CHIP_DEBUG_PRINT
# define CHIP_DBG(fmt, args...) printk(fmt, ## args)
# else
# define CHIP_DBG(fmt, args...) do { } while (0)
# endif
# undef FRAME_FILTER_DEBUG
/* #define FRAME_FILTER_DEBUG */
2009-10-15 02:13:45 +04:00
struct stmmac_extra_stats {
/* Transmit errors */
unsigned long tx_underflow ____cacheline_aligned ;
unsigned long tx_carrier ;
unsigned long tx_losscarrier ;
unsigned long tx_heartbeat ;
unsigned long tx_deferred ;
unsigned long tx_vlan ;
unsigned long tx_jabber ;
unsigned long tx_frame_flushed ;
unsigned long tx_payload_error ;
unsigned long tx_ip_header_error ;
/* Receive errors */
unsigned long rx_desc ;
unsigned long rx_partial ;
unsigned long rx_runt ;
unsigned long rx_toolong ;
unsigned long rx_collision ;
unsigned long rx_crc ;
2010-02-04 20:33:21 +03:00
unsigned long rx_length ;
2009-10-15 02:13:45 +04:00
unsigned long rx_mii ;
unsigned long rx_multicast ;
unsigned long rx_gmac_overflow ;
unsigned long rx_watchdog ;
unsigned long da_rx_filter_fail ;
unsigned long sa_rx_filter_fail ;
unsigned long rx_missed_cntr ;
unsigned long rx_overflow_cntr ;
unsigned long rx_vlan ;
/* Tx/Rx IRQ errors */
unsigned long tx_undeflow_irq ;
unsigned long tx_process_stopped_irq ;
unsigned long tx_jabber_irq ;
unsigned long rx_overflow_irq ;
unsigned long rx_buf_unav_irq ;
unsigned long rx_process_stopped_irq ;
unsigned long rx_watchdog_irq ;
unsigned long tx_early_irq ;
unsigned long fatal_bus_error_irq ;
/* Extra info */
unsigned long threshold ;
unsigned long tx_pkt_n ;
unsigned long rx_pkt_n ;
unsigned long poll_n ;
unsigned long sched_timer_n ;
unsigned long normal_irq_n ;
} ;
2010-01-07 02:07:18 +03:00
# define HASH_TABLE_SIZE 64
# define PAUSE_TIME 0x200
/* Flow Control defines */
# define FLOW_OFF 0
# define FLOW_RX 1
# define FLOW_TX 2
# define FLOW_AUTO (FLOW_TX | FLOW_RX)
# define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */
enum rx_frame_status { /* IPC status */
2009-10-15 02:13:45 +04:00
good_frame = 0 ,
discard_frame = 1 ,
csum_none = 2 ,
2010-07-27 04:09:47 +04:00
llc_snap = 4 ,
2009-10-15 02:13:45 +04:00
} ;
2010-01-07 02:07:18 +03:00
enum tx_dma_irq_status {
tx_hard_error = 1 ,
tx_hard_error_bump_tc = 2 ,
handle_tx_rx = 3 ,
} ;
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:18 +03:00
/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
# define BUF_SIZE_16KiB 16384
# define BUF_SIZE_8KiB 8192
# define BUF_SIZE_4KiB 4096
# define BUF_SIZE_2KiB 2048
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:18 +03:00
/* Power Down and WOL */
# define PMT_NOT_SUPPORTED 0
# define PMT_SUPPORTED 1
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:18 +03:00
/* Common MAC defines */
# define MAC_CTRL_REG 0x00000000 /* MAC Control */
# define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */
# define MAC_RNABLE_RX 0x00000004 /* Receiver Enable */
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:18 +03:00
/* MAC Management Counters register */
# define MMC_CONTROL 0x00000100 /* MMC Control */
# define MMC_HIGH_INTR 0x00000104 /* MMC High Interrupt */
# define MMC_LOW_INTR 0x00000108 /* MMC Low Interrupt */
# define MMC_HIGH_INTR_MASK 0x0000010c /* MMC High Interrupt Mask */
# define MMC_LOW_INTR_MASK 0x00000110 /* MMC Low Interrupt Mask */
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:18 +03:00
# define MMC_CONTROL_MAX_FRM_MASK 0x0003ff8 /* Maximum Frame Size */
# define MMC_CONTROL_MAX_FRM_SHIFT 3
# define MMC_CONTROL_MAX_FRAME 0x7FF
2009-10-15 02:13:45 +04:00
2010-01-07 02:07:17 +03:00
struct stmmac_desc_ops {
/* DMA RX descriptor ring initialization */
2009-10-15 02:13:45 +04:00
void ( * init_rx_desc ) ( struct dma_desc * p , unsigned int ring_size ,
2010-01-07 02:07:17 +03:00
int disable_rx_ic ) ;
/* DMA TX descriptor ring initialization */
2009-10-15 02:13:45 +04:00
void ( * init_tx_desc ) ( struct dma_desc * p , unsigned int ring_size ) ;
/* Invoked by the xmit function to prepare the tx descriptor */
void ( * prepare_tx_desc ) ( struct dma_desc * p , int is_fs , int len ,
int csum_flag ) ;
/* Set/get the owner of the descriptor */
void ( * set_tx_owner ) ( struct dma_desc * p ) ;
int ( * get_tx_owner ) ( struct dma_desc * p ) ;
/* Invoked by the xmit function to close the tx descriptor */
void ( * close_tx_desc ) ( struct dma_desc * p ) ;
/* Clean the tx descriptor as soon as the tx irq is received */
void ( * release_tx_desc ) ( struct dma_desc * p ) ;
/* Clear interrupt on tx frame completion. When this bit is
* set an interrupt happens as soon as the frame is transmitted */
void ( * clear_tx_ic ) ( struct dma_desc * p ) ;
/* Last tx segment reports the transmit status */
int ( * get_tx_ls ) ( struct dma_desc * p ) ;
/* Return the transmit status looking at the TDES1 */
int ( * tx_status ) ( void * data , struct stmmac_extra_stats * x ,
2010-08-24 00:40:42 +04:00
struct dma_desc * p , void __iomem * ioaddr ) ;
2009-10-15 02:13:45 +04:00
/* Get the buffer size from the descriptor */
int ( * get_tx_len ) ( struct dma_desc * p ) ;
/* Handle extra events on specific interrupts hw dependent */
int ( * get_rx_owner ) ( struct dma_desc * p ) ;
void ( * set_rx_owner ) ( struct dma_desc * p ) ;
/* Get the receive frame size */
int ( * get_rx_frame_len ) ( struct dma_desc * p ) ;
/* Return the reception status looking at the RDES1 */
int ( * rx_status ) ( void * data , struct stmmac_extra_stats * x ,
struct dma_desc * p ) ;
2010-01-07 02:07:17 +03:00
} ;
struct stmmac_dma_ops {
/* DMA core initialization */
2010-08-24 00:40:42 +04:00
int ( * init ) ( void __iomem * ioaddr , int pbl , u32 dma_tx , u32 dma_rx ) ;
2010-01-07 02:07:17 +03:00
/* Dump DMA registers */
2010-08-24 00:40:42 +04:00
void ( * dump_regs ) ( void __iomem * ioaddr ) ;
2010-01-07 02:07:17 +03:00
/* Set tx/rx threshold in the csr6 register
* An invalid value enables the store - and - forward mode */
2010-08-24 00:40:42 +04:00
void ( * dma_mode ) ( void __iomem * ioaddr , int txmode , int rxmode ) ;
2010-01-07 02:07:17 +03:00
/* To track extra statistic (if supported) */
void ( * dma_diagnostic_fr ) ( void * data , struct stmmac_extra_stats * x ,
2010-08-24 00:40:42 +04:00
void __iomem * ioaddr ) ;
void ( * enable_dma_transmission ) ( void __iomem * ioaddr ) ;
void ( * enable_dma_irq ) ( void __iomem * ioaddr ) ;
void ( * disable_dma_irq ) ( void __iomem * ioaddr ) ;
void ( * start_tx ) ( void __iomem * ioaddr ) ;
void ( * stop_tx ) ( void __iomem * ioaddr ) ;
void ( * start_rx ) ( void __iomem * ioaddr ) ;
void ( * stop_rx ) ( void __iomem * ioaddr ) ;
int ( * dma_interrupt ) ( void __iomem * ioaddr ,
2010-01-07 02:07:18 +03:00
struct stmmac_extra_stats * x ) ;
2010-01-07 02:07:17 +03:00
} ;
struct stmmac_ops {
/* MAC core initialization */
2010-08-24 00:40:42 +04:00
void ( * core_init ) ( void __iomem * ioaddr ) ____cacheline_aligned ;
2010-09-17 07:23:40 +04:00
/* Support checksum offload engine */
int ( * rx_coe ) ( void __iomem * ioaddr ) ;
2010-01-07 02:07:17 +03:00
/* Dump MAC registers */
2010-08-24 00:40:42 +04:00
void ( * dump_regs ) ( void __iomem * ioaddr ) ;
2010-01-07 02:07:17 +03:00
/* Handle extra events on specific interrupts hw dependent */
2010-08-24 00:40:42 +04:00
void ( * host_irq_status ) ( void __iomem * ioaddr ) ;
2009-10-15 02:13:45 +04:00
/* Multicast filter setting */
void ( * set_filter ) ( struct net_device * dev ) ;
/* Flow control setting */
2010-08-24 00:40:42 +04:00
void ( * flow_ctrl ) ( void __iomem * ioaddr , unsigned int duplex ,
2009-10-15 02:13:45 +04:00
unsigned int fc , unsigned int pause_time ) ;
/* Set power management mode (e.g. magic frame) */
2010-08-24 00:40:42 +04:00
void ( * pmt ) ( void __iomem * ioaddr , unsigned long mode ) ;
2009-10-15 02:13:45 +04:00
/* Set/Get Unicast MAC addresses */
2010-08-24 00:40:42 +04:00
void ( * set_umac_addr ) ( void __iomem * ioaddr , unsigned char * addr ,
2010-01-07 02:07:17 +03:00
unsigned int reg_n ) ;
2010-08-24 00:40:42 +04:00
void ( * get_umac_addr ) ( void __iomem * ioaddr , unsigned char * addr ,
2010-01-07 02:07:17 +03:00
unsigned int reg_n ) ;
2009-10-15 02:13:45 +04:00
} ;
struct mac_link {
int port ;
int duplex ;
int speed ;
} ;
struct mii_regs {
unsigned int addr ; /* MII Address */
unsigned int data ; /* MII Data */
} ;
struct mac_device_info {
2010-10-13 18:51:25 +04:00
const struct stmmac_ops * mac ;
const struct stmmac_desc_ops * desc ;
const struct stmmac_dma_ops * dma ;
2010-01-07 02:07:17 +03:00
struct mii_regs mii ; /* MII register Addresses */
struct mac_link link ;
2009-10-15 02:13:45 +04:00
} ;
2010-08-24 00:40:42 +04:00
struct mac_device_info * dwmac1000_setup ( void __iomem * ioaddr ) ;
struct mac_device_info * dwmac100_setup ( void __iomem * ioaddr ) ;
2010-01-07 02:07:18 +03:00
2010-08-24 00:40:42 +04:00
extern void stmmac_set_mac_addr ( void __iomem * ioaddr , u8 addr [ 6 ] ,
2010-01-07 02:07:18 +03:00
unsigned int high , unsigned int low ) ;
2010-08-24 00:40:42 +04:00
extern void stmmac_get_mac_addr ( void __iomem * ioaddr , unsigned char * addr ,
2010-01-07 02:07:18 +03:00
unsigned int high , unsigned int low ) ;
2010-08-24 00:40:42 +04:00
extern void dwmac_dma_flush_tx_fifo ( void __iomem * ioaddr ) ;