17ac6653aSJeff Kirsher /******************************************************************************* 27ac6653aSJeff Kirsher Copyright (C) 2007-2009 STMicroelectronics Ltd 37ac6653aSJeff Kirsher 47ac6653aSJeff Kirsher This program is free software; you can redistribute it and/or modify it 57ac6653aSJeff Kirsher under the terms and conditions of the GNU General Public License, 67ac6653aSJeff Kirsher version 2, as published by the Free Software Foundation. 77ac6653aSJeff Kirsher 87ac6653aSJeff Kirsher This program is distributed in the hope it will be useful, but WITHOUT 97ac6653aSJeff Kirsher ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 107ac6653aSJeff Kirsher FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 117ac6653aSJeff Kirsher more details. 127ac6653aSJeff Kirsher 137ac6653aSJeff Kirsher You should have received a copy of the GNU General Public License along with 147ac6653aSJeff Kirsher this program; if not, write to the Free Software Foundation, Inc., 157ac6653aSJeff Kirsher 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 167ac6653aSJeff Kirsher 177ac6653aSJeff Kirsher The full GNU General Public License is included in this distribution in 187ac6653aSJeff Kirsher the file called "COPYING". 197ac6653aSJeff Kirsher 207ac6653aSJeff Kirsher Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> 217ac6653aSJeff Kirsher *******************************************************************************/ 227ac6653aSJeff Kirsher 23bfab27a1SGiuseppe CAVALLARO #define STMMAC_RESOURCE_NAME "stmmaceth" 24bd856615SGiuseppe CAVALLARO #define DRV_MODULE_VERSION "March_2012" 25ba1377ffSGiuseppe CAVALLARO 26ba1377ffSGiuseppe CAVALLARO #include <linux/clk.h> 277ac6653aSJeff Kirsher #include <linux/stmmac.h> 28286a8372SGiuseppe CAVALLARO #include <linux/phy.h> 29*33d5e332SGiuseppe CAVALLARO #include <linux/pci.h> 307ac6653aSJeff Kirsher #include "common.h" 317ac6653aSJeff Kirsher #ifdef CONFIG_STMMAC_TIMER 327ac6653aSJeff Kirsher #include "stmmac_timer.h" 337ac6653aSJeff Kirsher #endif 347ac6653aSJeff Kirsher 357ac6653aSJeff Kirsher struct stmmac_priv { 367ac6653aSJeff Kirsher /* Frequently used values are kept adjacent for cache effect */ 377ac6653aSJeff Kirsher struct dma_desc *dma_tx ____cacheline_aligned; 387ac6653aSJeff Kirsher dma_addr_t dma_tx_phy; 397ac6653aSJeff Kirsher struct sk_buff **tx_skbuff; 407ac6653aSJeff Kirsher unsigned int cur_tx; 417ac6653aSJeff Kirsher unsigned int dirty_tx; 427ac6653aSJeff Kirsher unsigned int dma_tx_size; 437ac6653aSJeff Kirsher int tx_coalesce; 447ac6653aSJeff Kirsher 457ac6653aSJeff Kirsher struct dma_desc *dma_rx ; 467ac6653aSJeff Kirsher unsigned int cur_rx; 477ac6653aSJeff Kirsher unsigned int dirty_rx; 487ac6653aSJeff Kirsher struct sk_buff **rx_skbuff; 497ac6653aSJeff Kirsher dma_addr_t *rx_skbuff_dma; 507ac6653aSJeff Kirsher struct sk_buff_head rx_recycle; 517ac6653aSJeff Kirsher 527ac6653aSJeff Kirsher struct net_device *dev; 537ac6653aSJeff Kirsher dma_addr_t dma_rx_phy; 547ac6653aSJeff Kirsher unsigned int dma_rx_size; 557ac6653aSJeff Kirsher unsigned int dma_buf_sz; 567ac6653aSJeff Kirsher struct device *device; 577ac6653aSJeff Kirsher struct mac_device_info *hw; 587ac6653aSJeff Kirsher void __iomem *ioaddr; 597ac6653aSJeff Kirsher 607ac6653aSJeff Kirsher struct stmmac_extra_stats xstats; 617ac6653aSJeff Kirsher struct napi_struct napi; 627ac6653aSJeff Kirsher int no_csum_insertion; 637ac6653aSJeff Kirsher 647ac6653aSJeff Kirsher struct phy_device *phydev; 657ac6653aSJeff Kirsher int oldlink; 667ac6653aSJeff Kirsher int speed; 677ac6653aSJeff Kirsher int oldduplex; 687ac6653aSJeff Kirsher unsigned int flow_ctrl; 697ac6653aSJeff Kirsher unsigned int pause; 707ac6653aSJeff Kirsher struct mii_bus *mii; 717ac6653aSJeff Kirsher int mii_irq[PHY_MAX_ADDR]; 727ac6653aSJeff Kirsher 737ac6653aSJeff Kirsher u32 msg_enable; 747ac6653aSJeff Kirsher spinlock_t lock; 75a9097a96SGiuseppe CAVALLARO spinlock_t tx_lock; 767ac6653aSJeff Kirsher int wolopts; 773172d3afSDeepak Sikri int wol_irq; 787ac6653aSJeff Kirsher #ifdef CONFIG_STMMAC_TIMER 797ac6653aSJeff Kirsher struct stmmac_timer *tm; 807ac6653aSJeff Kirsher #endif 817ac6653aSJeff Kirsher struct plat_stmmacenet_data *plat; 821c901a46SGiuseppe CAVALLARO struct stmmac_counters mmc; 83e7434821SGiuseppe CAVALLARO struct dma_features dma_cap; 8419e30c14SGiuseppe CAVALLARO int hw_cap_support; 85ba1377ffSGiuseppe CAVALLARO #ifdef CONFIG_HAVE_CLK 86ba1377ffSGiuseppe CAVALLARO struct clk *stmmac_clk; 87ba1377ffSGiuseppe CAVALLARO #endif 88cd7201f4SGiuseppe CAVALLARO int clk_csr; 89cffb13f4SGiuseppe CAVALLARO int synopsys_id; 907ac6653aSJeff Kirsher }; 917ac6653aSJeff Kirsher 92bfab27a1SGiuseppe CAVALLARO extern int phyaddr; 93bfab27a1SGiuseppe CAVALLARO 947ac6653aSJeff Kirsher extern int stmmac_mdio_unregister(struct net_device *ndev); 957ac6653aSJeff Kirsher extern int stmmac_mdio_register(struct net_device *ndev); 967ac6653aSJeff Kirsher extern void stmmac_set_ethtool_ops(struct net_device *netdev); 977ac6653aSJeff Kirsher extern const struct stmmac_desc_ops enh_desc_ops; 987ac6653aSJeff Kirsher extern const struct stmmac_desc_ops ndesc_ops; 99bfab27a1SGiuseppe CAVALLARO int stmmac_freeze(struct net_device *ndev); 100bfab27a1SGiuseppe CAVALLARO int stmmac_restore(struct net_device *ndev); 101bfab27a1SGiuseppe CAVALLARO int stmmac_resume(struct net_device *ndev); 102bfab27a1SGiuseppe CAVALLARO int stmmac_suspend(struct net_device *ndev); 103bfab27a1SGiuseppe CAVALLARO int stmmac_dvr_remove(struct net_device *ndev); 104bfab27a1SGiuseppe CAVALLARO struct stmmac_priv *stmmac_dvr_probe(struct device *device, 105cf3f047bSGiuseppe CAVALLARO struct plat_stmmacenet_data *plat_dat, 106cf3f047bSGiuseppe CAVALLARO void __iomem *addr); 107ba1377ffSGiuseppe CAVALLARO 108ba1377ffSGiuseppe CAVALLARO #ifdef CONFIG_HAVE_CLK 109ba1377ffSGiuseppe CAVALLARO static inline int stmmac_clk_enable(struct stmmac_priv *priv) 110ba1377ffSGiuseppe CAVALLARO { 11131ea38eeSGiuseppe CAVALLARO if (!IS_ERR(priv->stmmac_clk)) 112ba1377ffSGiuseppe CAVALLARO return clk_enable(priv->stmmac_clk); 113ba1377ffSGiuseppe CAVALLARO 114ba1377ffSGiuseppe CAVALLARO return 0; 115ba1377ffSGiuseppe CAVALLARO } 116ba1377ffSGiuseppe CAVALLARO 117ba1377ffSGiuseppe CAVALLARO static inline void stmmac_clk_disable(struct stmmac_priv *priv) 118ba1377ffSGiuseppe CAVALLARO { 11931ea38eeSGiuseppe CAVALLARO if (IS_ERR(priv->stmmac_clk)) 12031ea38eeSGiuseppe CAVALLARO return; 12131ea38eeSGiuseppe CAVALLARO 122ba1377ffSGiuseppe CAVALLARO clk_disable(priv->stmmac_clk); 123ba1377ffSGiuseppe CAVALLARO } 124ba1377ffSGiuseppe CAVALLARO static inline int stmmac_clk_get(struct stmmac_priv *priv) 125ba1377ffSGiuseppe CAVALLARO { 126ba1377ffSGiuseppe CAVALLARO priv->stmmac_clk = clk_get(priv->device, NULL); 127ba1377ffSGiuseppe CAVALLARO 12831ea38eeSGiuseppe CAVALLARO if (IS_ERR(priv->stmmac_clk)) 129ba1377ffSGiuseppe CAVALLARO return PTR_ERR(priv->stmmac_clk); 13031ea38eeSGiuseppe CAVALLARO 131ba1377ffSGiuseppe CAVALLARO return 0; 132ba1377ffSGiuseppe CAVALLARO } 133ba1377ffSGiuseppe CAVALLARO #else 134ba1377ffSGiuseppe CAVALLARO static inline int stmmac_clk_enable(struct stmmac_priv *priv) 135ba1377ffSGiuseppe CAVALLARO { 136ba1377ffSGiuseppe CAVALLARO return 0; 137ba1377ffSGiuseppe CAVALLARO } 138ba1377ffSGiuseppe CAVALLARO static inline void stmmac_clk_disable(struct stmmac_priv *priv) 139ba1377ffSGiuseppe CAVALLARO { 140ba1377ffSGiuseppe CAVALLARO } 141ba1377ffSGiuseppe CAVALLARO static inline int stmmac_clk_get(struct stmmac_priv *priv) 142ba1377ffSGiuseppe CAVALLARO { 143ba1377ffSGiuseppe CAVALLARO return 0; 144ba1377ffSGiuseppe CAVALLARO } 145ba1377ffSGiuseppe CAVALLARO #endif /* CONFIG_HAVE_CLK */ 146*33d5e332SGiuseppe CAVALLARO 147*33d5e332SGiuseppe CAVALLARO 148*33d5e332SGiuseppe CAVALLARO #ifdef CONFIG_STMMAC_PLATFORM 149*33d5e332SGiuseppe CAVALLARO extern struct platform_driver stmmac_pltfr_driver; 150*33d5e332SGiuseppe CAVALLARO static inline int stmmac_register_platform(void) 151*33d5e332SGiuseppe CAVALLARO { 152*33d5e332SGiuseppe CAVALLARO int err; 153*33d5e332SGiuseppe CAVALLARO 154*33d5e332SGiuseppe CAVALLARO err = platform_driver_register(&stmmac_pltfr_driver); 155*33d5e332SGiuseppe CAVALLARO if (err) 156*33d5e332SGiuseppe CAVALLARO pr_err("stmmac: failed to register the platform driver\n"); 157*33d5e332SGiuseppe CAVALLARO 158*33d5e332SGiuseppe CAVALLARO return err; 159*33d5e332SGiuseppe CAVALLARO } 160*33d5e332SGiuseppe CAVALLARO static inline void stmmac_unregister_platform(void) 161*33d5e332SGiuseppe CAVALLARO { 162*33d5e332SGiuseppe CAVALLARO platform_driver_register(&stmmac_pltfr_driver); 163*33d5e332SGiuseppe CAVALLARO } 164*33d5e332SGiuseppe CAVALLARO #else 165*33d5e332SGiuseppe CAVALLARO static inline int stmmac_register_platform(void) 166*33d5e332SGiuseppe CAVALLARO { 167*33d5e332SGiuseppe CAVALLARO pr_debug("stmmac: do not register the platf driver\n"); 168*33d5e332SGiuseppe CAVALLARO 169*33d5e332SGiuseppe CAVALLARO return -EINVAL; 170*33d5e332SGiuseppe CAVALLARO } 171*33d5e332SGiuseppe CAVALLARO static inline void stmmac_unregister_platform(void) 172*33d5e332SGiuseppe CAVALLARO { 173*33d5e332SGiuseppe CAVALLARO } 174*33d5e332SGiuseppe CAVALLARO #endif /* CONFIG_STMMAC_PLATFORM */ 175*33d5e332SGiuseppe CAVALLARO 176*33d5e332SGiuseppe CAVALLARO #ifdef CONFIG_STMMAC_PCI 177*33d5e332SGiuseppe CAVALLARO extern struct pci_driver stmmac_pci_driver; 178*33d5e332SGiuseppe CAVALLARO static inline int stmmac_register_pci(void) 179*33d5e332SGiuseppe CAVALLARO { 180*33d5e332SGiuseppe CAVALLARO int err; 181*33d5e332SGiuseppe CAVALLARO 182*33d5e332SGiuseppe CAVALLARO err = pci_register_driver(&stmmac_pci_driver); 183*33d5e332SGiuseppe CAVALLARO if (err) 184*33d5e332SGiuseppe CAVALLARO pr_err("stmmac: failed to register the PCI driver\n"); 185*33d5e332SGiuseppe CAVALLARO 186*33d5e332SGiuseppe CAVALLARO return err; 187*33d5e332SGiuseppe CAVALLARO } 188*33d5e332SGiuseppe CAVALLARO static inline void stmmac_unregister_pci(void) 189*33d5e332SGiuseppe CAVALLARO { 190*33d5e332SGiuseppe CAVALLARO pci_unregister_driver(&stmmac_pci_driver); 191*33d5e332SGiuseppe CAVALLARO } 192*33d5e332SGiuseppe CAVALLARO #else 193*33d5e332SGiuseppe CAVALLARO static inline int stmmac_register_pci(void) 194*33d5e332SGiuseppe CAVALLARO { 195*33d5e332SGiuseppe CAVALLARO pr_debug("stmmac: do not register the PCI driver\n"); 196*33d5e332SGiuseppe CAVALLARO 197*33d5e332SGiuseppe CAVALLARO return -EINVAL; 198*33d5e332SGiuseppe CAVALLARO } 199*33d5e332SGiuseppe CAVALLARO static inline void stmmac_unregister_pci(void) 200*33d5e332SGiuseppe CAVALLARO { 201*33d5e332SGiuseppe CAVALLARO } 202*33d5e332SGiuseppe CAVALLARO #endif /* CONFIG_STMMAC_PCI */ 203