Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
stmmac_pci.c
Go to the documentation of this file.
1 /*******************************************************************************
2  This contains the functions to handle the pci driver.
3 
4  Copyright (C) 2011-2012 Vayavya Labs Pvt Ltd
5 
6  This program is free software; you can redistribute it and/or modify it
7  under the terms and conditions of the GNU General Public License,
8  version 2, as published by the Free Software Foundation.
9 
10  This program is distributed in the hope it will be useful, but WITHOUT
11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  more details.
14 
15  You should have received a copy of the GNU General Public License along with
16  this program; if not, write to the Free Software Foundation, Inc.,
17  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 
19  The full GNU General Public License is included in this distribution in
20  the file called "COPYING".
21 
22  Author: Rayagond Kokatanur <[email protected]>
23  Author: Giuseppe Cavallaro <[email protected]>
24 *******************************************************************************/
25 
26 #include <linux/pci.h>
27 #include "stmmac.h"
28 
32 
33 static void stmmac_default_data(void)
34 {
35  memset(&plat_dat, 0, sizeof(struct plat_stmmacenet_data));
36  plat_dat.bus_id = 1;
37  plat_dat.phy_addr = 0;
39  plat_dat.clk_csr = 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */
40  plat_dat.has_gmac = 1;
41  plat_dat.force_sf_dma_mode = 1;
42 
43  mdio_data.phy_reset = NULL;
44  mdio_data.phy_mask = 0;
45  plat_dat.mdio_bus_data = &mdio_data;
46 
47  dma_cfg.pbl = 32;
48  dma_cfg.burst_len = DMA_AXI_BLEN_256;
49  plat_dat.dma_cfg = &dma_cfg;
50 }
51 
64 static int __devinit stmmac_pci_probe(struct pci_dev *pdev,
65  const struct pci_device_id *id)
66 {
67  int ret = 0;
68  void __iomem *addr = NULL;
69  struct stmmac_priv *priv = NULL;
70  int i;
71 
72  /* Enable pci device */
73  ret = pci_enable_device(pdev);
74  if (ret) {
75  pr_err("%s : ERROR: failed to enable %s device\n", __func__,
76  pci_name(pdev));
77  return ret;
78  }
80  pr_err("%s: ERROR: failed to get PCI region\n", __func__);
81  ret = -ENODEV;
82  goto err_out_req_reg_failed;
83  }
84 
85  /* Get the base address of device */
86  for (i = 0; i <= 5; i++) {
87  if (pci_resource_len(pdev, i) == 0)
88  continue;
89  addr = pci_iomap(pdev, i, 0);
90  if (addr == NULL) {
91  pr_err("%s: ERROR: cannot map register memory, aborting",
92  __func__);
93  ret = -EIO;
94  goto err_out_map_failed;
95  }
96  break;
97  }
98  pci_set_master(pdev);
99 
100  stmmac_default_data();
101 
102  priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat, addr);
103  if (!priv) {
104  pr_err("%s: main driver probe failed", __func__);
105  goto err_out;
106  }
107  priv->dev->irq = pdev->irq;
108  priv->wol_irq = pdev->irq;
109 
110  pci_set_drvdata(pdev, priv->dev);
111 
112  pr_debug("STMMAC platform driver registration completed");
113 
114  return 0;
115 
116 err_out:
117  pci_clear_master(pdev);
118 err_out_map_failed:
119  pci_release_regions(pdev);
120 err_out_req_reg_failed:
121  pci_disable_device(pdev);
122 
123  return ret;
124 }
125 
133 static void __devexit stmmac_pci_remove(struct pci_dev *pdev)
134 {
135  struct net_device *ndev = pci_get_drvdata(pdev);
136  struct stmmac_priv *priv = netdev_priv(ndev);
137 
138  stmmac_dvr_remove(ndev);
139 
140  pci_set_drvdata(pdev, NULL);
141  pci_iounmap(pdev, priv->ioaddr);
142  pci_release_regions(pdev);
143  pci_disable_device(pdev);
144 }
145 
146 #ifdef CONFIG_PM
147 static int stmmac_pci_suspend(struct pci_dev *pdev, pm_message_t state)
148 {
149  struct net_device *ndev = pci_get_drvdata(pdev);
150  int ret;
151 
152  ret = stmmac_suspend(ndev);
153  pci_save_state(pdev);
154  pci_set_power_state(pdev, pci_choose_state(pdev, state));
155 
156  return ret;
157 }
158 
159 static int stmmac_pci_resume(struct pci_dev *pdev)
160 {
161  struct net_device *ndev = pci_get_drvdata(pdev);
162 
164  pci_restore_state(pdev);
165 
166  return stmmac_resume(ndev);
167 }
168 #endif
169 
170 #define STMMAC_VENDOR_ID 0x700
171 #define STMMAC_DEVICE_ID 0x1108
172 
173 static DEFINE_PCI_DEVICE_TABLE(stmmac_id_table) = {
176  {}
177 };
178 
179 MODULE_DEVICE_TABLE(pci, stmmac_id_table);
180 
182  .name = STMMAC_RESOURCE_NAME,
183  .id_table = stmmac_id_table,
184  .probe = stmmac_pci_probe,
185  .remove = __devexit_p(stmmac_pci_remove),
186 #ifdef CONFIG_PM
187  .suspend = stmmac_pci_suspend,
188  .resume = stmmac_pci_resume,
189 #endif
190 };
191 
192 MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet PCI driver");
193 MODULE_AUTHOR("Rayagond Kokatanur <[email protected]>");
194 MODULE_AUTHOR("Giuseppe Cavallaro <[email protected]>");
195 MODULE_LICENSE("GPL");