]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/net/ethernet/intel/fm10k/fm10k_pci.c
5fcbd1d621b7e9e28974a7b251df83e43cb0c936
[karo-tx-linux.git] / drivers / net / ethernet / intel / fm10k / fm10k_pci.c
1 /* Intel Ethernet Switch Host Interface Driver
2  * Copyright(c) 2013 - 2014 Intel Corporation.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * The full GNU General Public License is included in this distribution in
14  * the file called "COPYING".
15  *
16  * Contact Information:
17  * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
18  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
19  */
20
21 #include <linux/module.h>
22
23 #include "fm10k.h"
24
25 static const struct fm10k_info *fm10k_info_tbl[] = {
26         [fm10k_device_pf] = &fm10k_pf_info,
27 };
28
29 /**
30  * fm10k_pci_tbl - PCI Device ID Table
31  *
32  * Wildcard entries (PCI_ANY_ID) should come last
33  * Last entry must be all 0s
34  *
35  * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
36  *   Class, Class Mask, private data (not used) }
37  */
38 static const struct pci_device_id fm10k_pci_tbl[] = {
39         { PCI_VDEVICE(INTEL, FM10K_DEV_ID_PF), fm10k_device_pf },
40         /* required last entry */
41         { 0, }
42 };
43 MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl);
44
45 u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg)
46 {
47         struct fm10k_intfc *interface = hw->back;
48         u16 value = 0;
49
50         if (FM10K_REMOVED(hw->hw_addr))
51                 return ~value;
52
53         pci_read_config_word(interface->pdev, reg, &value);
54         if (value == 0xFFFF)
55                 fm10k_write_flush(hw);
56
57         return value;
58 }
59
60 u32 fm10k_read_reg(struct fm10k_hw *hw, int reg)
61 {
62         u32 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr);
63         u32 value = 0;
64
65         if (FM10K_REMOVED(hw_addr))
66                 return ~value;
67
68         value = readl(&hw_addr[reg]);
69         if (!(~value) && (!reg || !(~readl(hw_addr)))) {
70                 struct fm10k_intfc *interface = hw->back;
71                 struct net_device *netdev = interface->netdev;
72
73                 hw->hw_addr = NULL;
74                 netif_device_detach(netdev);
75                 netdev_err(netdev, "PCIe link lost, device now detached\n");
76         }
77
78         return value;
79 }
80
81 static int fm10k_hw_ready(struct fm10k_intfc *interface)
82 {
83         struct fm10k_hw *hw = &interface->hw;
84
85         fm10k_write_flush(hw);
86
87         return FM10K_REMOVED(hw->hw_addr) ? -ENODEV : 0;
88 }
89
90 /**
91  * fm10k_sw_init - Initialize general software structures
92  * @interface: host interface private structure to initialize
93  *
94  * fm10k_sw_init initializes the interface private data structure.
95  * Fields are initialized based on PCI device information and
96  * OS network device settings (MTU size).
97  **/
98 static int fm10k_sw_init(struct fm10k_intfc *interface,
99                          const struct pci_device_id *ent)
100 {
101         static const u32 seed[FM10K_RSSRK_SIZE] = { 0xda565a6d, 0xc20e5b25,
102                                                     0x3d256741, 0xb08fa343,
103                                                     0xcb2bcad0, 0xb4307bae,
104                                                     0xa32dcb77, 0x0cf23080,
105                                                     0x3bb7426a, 0xfa01acbe };
106         const struct fm10k_info *fi = fm10k_info_tbl[ent->driver_data];
107         struct fm10k_hw *hw = &interface->hw;
108         struct pci_dev *pdev = interface->pdev;
109         struct net_device *netdev = interface->netdev;
110         unsigned int rss;
111         int err;
112
113         /* initialize back pointer */
114         hw->back = interface;
115         hw->hw_addr = interface->uc_addr;
116
117         /* PCI config space info */
118         hw->vendor_id = pdev->vendor;
119         hw->device_id = pdev->device;
120         hw->revision_id = pdev->revision;
121         hw->subsystem_vendor_id = pdev->subsystem_vendor;
122         hw->subsystem_device_id = pdev->subsystem_device;
123
124         /* Setup hw api */
125         memcpy(&hw->mac.ops, fi->mac_ops, sizeof(hw->mac.ops));
126         hw->mac.type = fi->mac;
127
128         /* Set common capability flags and settings */
129         rss = min_t(int, FM10K_MAX_RSS_INDICES, num_online_cpus());
130         interface->ring_feature[RING_F_RSS].limit = rss;
131         fi->get_invariants(hw);
132
133         /* pick up the PCIe bus settings for reporting later */
134         if (hw->mac.ops.get_bus_info)
135                 hw->mac.ops.get_bus_info(hw);
136
137         /* limit the usable DMA range */
138         if (hw->mac.ops.set_dma_mask)
139                 hw->mac.ops.set_dma_mask(hw, dma_get_mask(&pdev->dev));
140
141         /* update netdev with DMA restrictions */
142         if (dma_get_mask(&pdev->dev) > DMA_BIT_MASK(32)) {
143                 netdev->features |= NETIF_F_HIGHDMA;
144                 netdev->vlan_features |= NETIF_F_HIGHDMA;
145         }
146
147         /* reset and initialize the hardware so it is in a known state */
148         err = hw->mac.ops.reset_hw(hw) ? : hw->mac.ops.init_hw(hw);
149         if (err) {
150                 dev_err(&pdev->dev, "init_hw failed: %d\n", err);
151                 return err;
152         }
153
154         /* initialize hardware statistics */
155         hw->mac.ops.update_hw_stats(hw, &interface->stats);
156
157         /* Start with random Ethernet address */
158         eth_random_addr(hw->mac.addr);
159
160         /* Initialize MAC address from hardware */
161         err = hw->mac.ops.read_mac_addr(hw);
162         if (err) {
163                 dev_warn(&pdev->dev,
164                          "Failed to obtain MAC address defaulting to random\n");
165                 /* tag address assignment as random */
166                 netdev->addr_assign_type |= NET_ADDR_RANDOM;
167         }
168
169         memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
170         memcpy(netdev->perm_addr, hw->mac.addr, netdev->addr_len);
171
172         if (!is_valid_ether_addr(netdev->perm_addr)) {
173                 dev_err(&pdev->dev, "Invalid MAC Address\n");
174                 return -EIO;
175         }
176
177         /* Only the PF can support VXLAN and NVGRE offloads */
178         if (hw->mac.type != fm10k_mac_pf) {
179                 netdev->hw_enc_features = 0;
180                 netdev->features &= ~NETIF_F_GSO_UDP_TUNNEL;
181                 netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;
182         }
183
184         /* initialize vxlan_port list */
185         INIT_LIST_HEAD(&interface->vxlan_port);
186
187         /* initialize RSS key */
188         memcpy(interface->rssrk, seed, sizeof(seed));
189
190         /* Start off interface as being down */
191         set_bit(__FM10K_DOWN, &interface->state);
192
193         return 0;
194 }
195
196 static void fm10k_slot_warn(struct fm10k_intfc *interface)
197 {
198         struct device *dev = &interface->pdev->dev;
199         struct fm10k_hw *hw = &interface->hw;
200
201         if (hw->mac.ops.is_slot_appropriate(hw))
202                 return;
203
204         dev_warn(dev,
205                  "For optimal performance, a %s %s slot is recommended.\n",
206                  (hw->bus_caps.width == fm10k_bus_width_pcie_x1 ? "x1" :
207                   hw->bus_caps.width == fm10k_bus_width_pcie_x4 ? "x4" :
208                   "x8"),
209                  (hw->bus_caps.speed == fm10k_bus_speed_2500 ? "2.5GT/s" :
210                   hw->bus_caps.speed == fm10k_bus_speed_5000 ? "5.0GT/s" :
211                   "8.0GT/s"));
212         dev_warn(dev,
213                  "A slot with more lanes and/or higher speed is suggested.\n");
214 }
215
216 /**
217  * fm10k_probe - Device Initialization Routine
218  * @pdev: PCI device information struct
219  * @ent: entry in fm10k_pci_tbl
220  *
221  * Returns 0 on success, negative on failure
222  *
223  * fm10k_probe initializes an interface identified by a pci_dev structure.
224  * The OS initialization, configuring of the interface private structure,
225  * and a hardware reset occur.
226  **/
227 static int fm10k_probe(struct pci_dev *pdev,
228                        const struct pci_device_id *ent)
229 {
230         struct net_device *netdev;
231         struct fm10k_intfc *interface;
232         struct fm10k_hw *hw;
233         int err;
234         u64 dma_mask;
235
236         err = pci_enable_device_mem(pdev);
237         if (err)
238                 return err;
239
240         /* By default fm10k only supports a 48 bit DMA mask */
241         dma_mask = DMA_BIT_MASK(48) | dma_get_required_mask(&pdev->dev);
242
243         if ((dma_mask <= DMA_BIT_MASK(32)) ||
244             dma_set_mask_and_coherent(&pdev->dev, dma_mask)) {
245                 dma_mask &= DMA_BIT_MASK(32);
246
247                 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
248                 err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
249                 if (err) {
250                         err = dma_set_coherent_mask(&pdev->dev,
251                                                     DMA_BIT_MASK(32));
252                         if (err) {
253                                 dev_err(&pdev->dev,
254                                         "No usable DMA configuration, aborting\n");
255                                 goto err_dma;
256                         }
257                 }
258         }
259
260         err = pci_request_selected_regions(pdev,
261                                            pci_select_bars(pdev,
262                                                            IORESOURCE_MEM),
263                                            fm10k_driver_name);
264         if (err) {
265                 dev_err(&pdev->dev,
266                         "pci_request_selected_regions failed 0x%x\n", err);
267                 goto err_pci_reg;
268         }
269
270         pci_set_master(pdev);
271         pci_save_state(pdev);
272
273         netdev = fm10k_alloc_netdev();
274         if (!netdev) {
275                 err = -ENOMEM;
276                 goto err_alloc_netdev;
277         }
278
279         SET_NETDEV_DEV(netdev, &pdev->dev);
280
281         interface = netdev_priv(netdev);
282         pci_set_drvdata(pdev, interface);
283
284         interface->netdev = netdev;
285         interface->pdev = pdev;
286         hw = &interface->hw;
287
288         interface->uc_addr = ioremap(pci_resource_start(pdev, 0),
289                                      FM10K_UC_ADDR_SIZE);
290         if (!interface->uc_addr) {
291                 err = -EIO;
292                 goto err_ioremap;
293         }
294
295         err = fm10k_sw_init(interface, ent);
296         if (err)
297                 goto err_sw_init;
298
299         /* final check of hardware state before registering the interface */
300         err = fm10k_hw_ready(interface);
301         if (err)
302                 goto err_register;
303
304         err = register_netdev(netdev);
305         if (err)
306                 goto err_register;
307
308         /* carrier off reporting is important to ethtool even BEFORE open */
309         netif_carrier_off(netdev);
310
311         /* stop all the transmit queues from transmitting until link is up */
312         netif_tx_stop_all_queues(netdev);
313
314         /* print bus type/speed/width info */
315         dev_info(&pdev->dev, "(PCI Express:%s Width: %s Payload: %s)\n",
316                  (hw->bus.speed == fm10k_bus_speed_8000 ? "8.0GT/s" :
317                   hw->bus.speed == fm10k_bus_speed_5000 ? "5.0GT/s" :
318                   hw->bus.speed == fm10k_bus_speed_2500 ? "2.5GT/s" :
319                   "Unknown"),
320                  (hw->bus.width == fm10k_bus_width_pcie_x8 ? "x8" :
321                   hw->bus.width == fm10k_bus_width_pcie_x4 ? "x4" :
322                   hw->bus.width == fm10k_bus_width_pcie_x1 ? "x1" :
323                   "Unknown"),
324                  (hw->bus.payload == fm10k_bus_payload_128 ? "128B" :
325                   hw->bus.payload == fm10k_bus_payload_256 ? "256B" :
326                   hw->bus.payload == fm10k_bus_payload_512 ? "512B" :
327                   "Unknown"));
328
329         /* print warning for non-optimal configurations */
330         fm10k_slot_warn(interface);
331
332         return 0;
333
334 err_register:
335 err_sw_init:
336         iounmap(interface->uc_addr);
337 err_ioremap:
338         free_netdev(netdev);
339 err_alloc_netdev:
340         pci_release_selected_regions(pdev,
341                                      pci_select_bars(pdev, IORESOURCE_MEM));
342 err_pci_reg:
343 err_dma:
344         pci_disable_device(pdev);
345         return err;
346 }
347
348 /**
349  * fm10k_remove - Device Removal Routine
350  * @pdev: PCI device information struct
351  *
352  * fm10k_remove is called by the PCI subsystem to alert the driver
353  * that it should release a PCI device.  The could be caused by a
354  * Hot-Plug event, or because the driver is going to be removed from
355  * memory.
356  **/
357 static void fm10k_remove(struct pci_dev *pdev)
358 {
359         struct fm10k_intfc *interface = pci_get_drvdata(pdev);
360         struct net_device *netdev = interface->netdev;
361
362         /* free netdev, this may bounce the interrupts due to setup_tc */
363         if (netdev->reg_state == NETREG_REGISTERED)
364                 unregister_netdev(netdev);
365
366         iounmap(interface->uc_addr);
367
368         free_netdev(netdev);
369
370         pci_release_selected_regions(pdev,
371                                      pci_select_bars(pdev, IORESOURCE_MEM));
372
373         pci_disable_device(pdev);
374 }
375
376 static struct pci_driver fm10k_driver = {
377         .name                   = fm10k_driver_name,
378         .id_table               = fm10k_pci_tbl,
379         .probe                  = fm10k_probe,
380         .remove                 = fm10k_remove,
381 };
382
383 /**
384  * fm10k_register_pci_driver - register driver interface
385  *
386  * This funciton is called on module load in order to register the driver.
387  **/
388 int fm10k_register_pci_driver(void)
389 {
390         return pci_register_driver(&fm10k_driver);
391 }
392
393 /**
394  * fm10k_unregister_pci_driver - unregister driver interface
395  *
396  * This funciton is called on module unload in order to remove the driver.
397  **/
398 void fm10k_unregister_pci_driver(void)
399 {
400         pci_unregister_driver(&fm10k_driver);
401 }