blob: 5fcbd1d621b7e9e28974a7b251df83e43cb0c936 [file] [log] [blame]
Alexander Duyckb3890e32014-09-20 19:46:05 -04001/* 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
Alexander Duyck0e7b3642014-09-20 19:48:10 -040025static const struct fm10k_info *fm10k_info_tbl[] = {
26 [fm10k_device_pf] = &fm10k_pf_info,
27};
28
Alexander Duyckb3890e32014-09-20 19:46:05 -040029/**
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 */
38static const struct pci_device_id fm10k_pci_tbl[] = {
Alexander Duyck0e7b3642014-09-20 19:48:10 -040039 { PCI_VDEVICE(INTEL, FM10K_DEV_ID_PF), fm10k_device_pf },
Alexander Duyckb3890e32014-09-20 19:46:05 -040040 /* required last entry */
41 { 0, }
42};
43MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl);
44
Alexander Duyck04a5aef2014-09-20 19:46:45 -040045u16 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
60u32 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]);
Alexander Duyck0e7b3642014-09-20 19:48:10 -040069 if (!(~value) && (!reg || !(~readl(hw_addr)))) {
70 struct fm10k_intfc *interface = hw->back;
71 struct net_device *netdev = interface->netdev;
72
Alexander Duyck04a5aef2014-09-20 19:46:45 -040073 hw->hw_addr = NULL;
Alexander Duyck0e7b3642014-09-20 19:48:10 -040074 netif_device_detach(netdev);
75 netdev_err(netdev, "PCIe link lost, device now detached\n");
76 }
Alexander Duyck04a5aef2014-09-20 19:46:45 -040077
78 return value;
79}
80
Alexander Duyck0e7b3642014-09-20 19:48:10 -040081static 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 **/
98static 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
196static 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
Alexander Duyckb3890e32014-09-20 19:46:05 -0400216/**
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 **/
227static int fm10k_probe(struct pci_dev *pdev,
228 const struct pci_device_id *ent)
229{
Alexander Duyck0e7b3642014-09-20 19:48:10 -0400230 struct net_device *netdev;
231 struct fm10k_intfc *interface;
232 struct fm10k_hw *hw;
Alexander Duyckb3890e32014-09-20 19:46:05 -0400233 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
Alexander Duyck0e7b3642014-09-20 19:48:10 -0400273 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
Alexander Duyckb3890e32014-09-20 19:46:05 -0400332 return 0;
333
Alexander Duyck0e7b3642014-09-20 19:48:10 -0400334err_register:
335err_sw_init:
336 iounmap(interface->uc_addr);
337err_ioremap:
338 free_netdev(netdev);
339err_alloc_netdev:
340 pci_release_selected_regions(pdev,
341 pci_select_bars(pdev, IORESOURCE_MEM));
Alexander Duyckb3890e32014-09-20 19:46:05 -0400342err_pci_reg:
343err_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 **/
357static void fm10k_remove(struct pci_dev *pdev)
358{
Alexander Duyck0e7b3642014-09-20 19:48:10 -0400359 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
Alexander Duyckb3890e32014-09-20 19:46:05 -0400370 pci_release_selected_regions(pdev,
371 pci_select_bars(pdev, IORESOURCE_MEM));
372
373 pci_disable_device(pdev);
374}
375
376static 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 **/
388int 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 **/
398void fm10k_unregister_pci_driver(void)
399{
400 pci_unregister_driver(&fm10k_driver);
401}