1 /* Intel Ethernet Switch Host Interface Driver
2 * Copyright(c) 2013 - 2014 Intel Corporation.
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.
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
13 * The full GNU General Public License is included in this distribution in
14 * the file called "COPYING".
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
21 #include <linux/module.h>
25 static const struct fm10k_info *fm10k_info_tbl[] = {
26 [fm10k_device_pf] = &fm10k_pf_info,
30 * fm10k_pci_tbl - PCI Device ID Table
32 * Wildcard entries (PCI_ANY_ID) should come last
33 * Last entry must be all 0s
35 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
36 * Class, Class Mask, private data (not used) }
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 */
43 MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl);
45 u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg)
47 struct fm10k_intfc *interface = hw->back;
50 if (FM10K_REMOVED(hw->hw_addr))
53 pci_read_config_word(interface->pdev, reg, &value);
55 fm10k_write_flush(hw);
60 u32 fm10k_read_reg(struct fm10k_hw *hw, int reg)
62 u32 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr);
65 if (FM10K_REMOVED(hw_addr))
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;
74 netif_device_detach(netdev);
75 netdev_err(netdev, "PCIe link lost, device now detached\n");
81 static int fm10k_hw_ready(struct fm10k_intfc *interface)
83 struct fm10k_hw *hw = &interface->hw;
85 fm10k_write_flush(hw);
87 return FM10K_REMOVED(hw->hw_addr) ? -ENODEV : 0;
90 void fm10k_up(struct fm10k_intfc *interface)
92 struct fm10k_hw *hw = &interface->hw;
94 /* Enable Tx/Rx DMA */
95 hw->mac.ops.start_hw(hw);
97 /* configure interrupts */
98 hw->mac.ops.update_int_moderator(hw);
100 /* clear down bit to indicate we are ready to go */
101 clear_bit(__FM10K_DOWN, &interface->state);
103 /* re-establish Rx filters */
104 fm10k_restore_rx_state(interface);
106 /* enable transmits */
107 netif_tx_start_all_queues(interface->netdev);
110 void fm10k_down(struct fm10k_intfc *interface)
112 struct net_device *netdev = interface->netdev;
113 struct fm10k_hw *hw = &interface->hw;
115 /* signal that we are down to the interrupt handler and service task */
116 set_bit(__FM10K_DOWN, &interface->state);
118 /* call carrier off first to avoid false dev_watchdog timeouts */
119 netif_carrier_off(netdev);
121 /* disable transmits */
122 netif_tx_stop_all_queues(netdev);
123 netif_tx_disable(netdev);
125 /* reset Rx filters */
126 fm10k_reset_rx_state(interface);
128 /* allow 10ms for device to quiesce */
129 usleep_range(10000, 20000);
131 /* Disable DMA engine for Tx/Rx */
132 hw->mac.ops.stop_hw(hw);
136 * fm10k_sw_init - Initialize general software structures
137 * @interface: host interface private structure to initialize
139 * fm10k_sw_init initializes the interface private data structure.
140 * Fields are initialized based on PCI device information and
141 * OS network device settings (MTU size).
143 static int fm10k_sw_init(struct fm10k_intfc *interface,
144 const struct pci_device_id *ent)
146 static const u32 seed[FM10K_RSSRK_SIZE] = { 0xda565a6d, 0xc20e5b25,
147 0x3d256741, 0xb08fa343,
148 0xcb2bcad0, 0xb4307bae,
149 0xa32dcb77, 0x0cf23080,
150 0x3bb7426a, 0xfa01acbe };
151 const struct fm10k_info *fi = fm10k_info_tbl[ent->driver_data];
152 struct fm10k_hw *hw = &interface->hw;
153 struct pci_dev *pdev = interface->pdev;
154 struct net_device *netdev = interface->netdev;
158 /* initialize back pointer */
159 hw->back = interface;
160 hw->hw_addr = interface->uc_addr;
162 /* PCI config space info */
163 hw->vendor_id = pdev->vendor;
164 hw->device_id = pdev->device;
165 hw->revision_id = pdev->revision;
166 hw->subsystem_vendor_id = pdev->subsystem_vendor;
167 hw->subsystem_device_id = pdev->subsystem_device;
170 memcpy(&hw->mac.ops, fi->mac_ops, sizeof(hw->mac.ops));
171 hw->mac.type = fi->mac;
173 /* Set common capability flags and settings */
174 rss = min_t(int, FM10K_MAX_RSS_INDICES, num_online_cpus());
175 interface->ring_feature[RING_F_RSS].limit = rss;
176 fi->get_invariants(hw);
178 /* pick up the PCIe bus settings for reporting later */
179 if (hw->mac.ops.get_bus_info)
180 hw->mac.ops.get_bus_info(hw);
182 /* limit the usable DMA range */
183 if (hw->mac.ops.set_dma_mask)
184 hw->mac.ops.set_dma_mask(hw, dma_get_mask(&pdev->dev));
186 /* update netdev with DMA restrictions */
187 if (dma_get_mask(&pdev->dev) > DMA_BIT_MASK(32)) {
188 netdev->features |= NETIF_F_HIGHDMA;
189 netdev->vlan_features |= NETIF_F_HIGHDMA;
192 /* reset and initialize the hardware so it is in a known state */
193 err = hw->mac.ops.reset_hw(hw) ? : hw->mac.ops.init_hw(hw);
195 dev_err(&pdev->dev, "init_hw failed: %d\n", err);
199 /* initialize hardware statistics */
200 hw->mac.ops.update_hw_stats(hw, &interface->stats);
202 /* Start with random Ethernet address */
203 eth_random_addr(hw->mac.addr);
205 /* Initialize MAC address from hardware */
206 err = hw->mac.ops.read_mac_addr(hw);
209 "Failed to obtain MAC address defaulting to random\n");
210 /* tag address assignment as random */
211 netdev->addr_assign_type |= NET_ADDR_RANDOM;
214 memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
215 memcpy(netdev->perm_addr, hw->mac.addr, netdev->addr_len);
217 if (!is_valid_ether_addr(netdev->perm_addr)) {
218 dev_err(&pdev->dev, "Invalid MAC Address\n");
222 /* Only the PF can support VXLAN and NVGRE offloads */
223 if (hw->mac.type != fm10k_mac_pf) {
224 netdev->hw_enc_features = 0;
225 netdev->features &= ~NETIF_F_GSO_UDP_TUNNEL;
226 netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;
229 /* initialize vxlan_port list */
230 INIT_LIST_HEAD(&interface->vxlan_port);
232 /* initialize RSS key */
233 memcpy(interface->rssrk, seed, sizeof(seed));
235 /* Start off interface as being down */
236 set_bit(__FM10K_DOWN, &interface->state);
241 static void fm10k_slot_warn(struct fm10k_intfc *interface)
243 struct device *dev = &interface->pdev->dev;
244 struct fm10k_hw *hw = &interface->hw;
246 if (hw->mac.ops.is_slot_appropriate(hw))
250 "For optimal performance, a %s %s slot is recommended.\n",
251 (hw->bus_caps.width == fm10k_bus_width_pcie_x1 ? "x1" :
252 hw->bus_caps.width == fm10k_bus_width_pcie_x4 ? "x4" :
254 (hw->bus_caps.speed == fm10k_bus_speed_2500 ? "2.5GT/s" :
255 hw->bus_caps.speed == fm10k_bus_speed_5000 ? "5.0GT/s" :
258 "A slot with more lanes and/or higher speed is suggested.\n");
262 * fm10k_probe - Device Initialization Routine
263 * @pdev: PCI device information struct
264 * @ent: entry in fm10k_pci_tbl
266 * Returns 0 on success, negative on failure
268 * fm10k_probe initializes an interface identified by a pci_dev structure.
269 * The OS initialization, configuring of the interface private structure,
270 * and a hardware reset occur.
272 static int fm10k_probe(struct pci_dev *pdev,
273 const struct pci_device_id *ent)
275 struct net_device *netdev;
276 struct fm10k_intfc *interface;
281 err = pci_enable_device_mem(pdev);
285 /* By default fm10k only supports a 48 bit DMA mask */
286 dma_mask = DMA_BIT_MASK(48) | dma_get_required_mask(&pdev->dev);
288 if ((dma_mask <= DMA_BIT_MASK(32)) ||
289 dma_set_mask_and_coherent(&pdev->dev, dma_mask)) {
290 dma_mask &= DMA_BIT_MASK(32);
292 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
293 err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
295 err = dma_set_coherent_mask(&pdev->dev,
299 "No usable DMA configuration, aborting\n");
305 err = pci_request_selected_regions(pdev,
306 pci_select_bars(pdev,
311 "pci_request_selected_regions failed 0x%x\n", err);
315 pci_set_master(pdev);
316 pci_save_state(pdev);
318 netdev = fm10k_alloc_netdev();
321 goto err_alloc_netdev;
324 SET_NETDEV_DEV(netdev, &pdev->dev);
326 interface = netdev_priv(netdev);
327 pci_set_drvdata(pdev, interface);
329 interface->netdev = netdev;
330 interface->pdev = pdev;
333 interface->uc_addr = ioremap(pci_resource_start(pdev, 0),
335 if (!interface->uc_addr) {
340 err = fm10k_sw_init(interface, ent);
344 /* final check of hardware state before registering the interface */
345 err = fm10k_hw_ready(interface);
349 err = register_netdev(netdev);
353 /* carrier off reporting is important to ethtool even BEFORE open */
354 netif_carrier_off(netdev);
356 /* stop all the transmit queues from transmitting until link is up */
357 netif_tx_stop_all_queues(netdev);
359 /* print bus type/speed/width info */
360 dev_info(&pdev->dev, "(PCI Express:%s Width: %s Payload: %s)\n",
361 (hw->bus.speed == fm10k_bus_speed_8000 ? "8.0GT/s" :
362 hw->bus.speed == fm10k_bus_speed_5000 ? "5.0GT/s" :
363 hw->bus.speed == fm10k_bus_speed_2500 ? "2.5GT/s" :
365 (hw->bus.width == fm10k_bus_width_pcie_x8 ? "x8" :
366 hw->bus.width == fm10k_bus_width_pcie_x4 ? "x4" :
367 hw->bus.width == fm10k_bus_width_pcie_x1 ? "x1" :
369 (hw->bus.payload == fm10k_bus_payload_128 ? "128B" :
370 hw->bus.payload == fm10k_bus_payload_256 ? "256B" :
371 hw->bus.payload == fm10k_bus_payload_512 ? "512B" :
374 /* print warning for non-optimal configurations */
375 fm10k_slot_warn(interface);
381 iounmap(interface->uc_addr);
385 pci_release_selected_regions(pdev,
386 pci_select_bars(pdev, IORESOURCE_MEM));
389 pci_disable_device(pdev);
394 * fm10k_remove - Device Removal Routine
395 * @pdev: PCI device information struct
397 * fm10k_remove is called by the PCI subsystem to alert the driver
398 * that it should release a PCI device. The could be caused by a
399 * Hot-Plug event, or because the driver is going to be removed from
402 static void fm10k_remove(struct pci_dev *pdev)
404 struct fm10k_intfc *interface = pci_get_drvdata(pdev);
405 struct net_device *netdev = interface->netdev;
407 /* free netdev, this may bounce the interrupts due to setup_tc */
408 if (netdev->reg_state == NETREG_REGISTERED)
409 unregister_netdev(netdev);
411 iounmap(interface->uc_addr);
415 pci_release_selected_regions(pdev,
416 pci_select_bars(pdev, IORESOURCE_MEM));
418 pci_disable_device(pdev);
421 static struct pci_driver fm10k_driver = {
422 .name = fm10k_driver_name,
423 .id_table = fm10k_pci_tbl,
424 .probe = fm10k_probe,
425 .remove = fm10k_remove,
429 * fm10k_register_pci_driver - register driver interface
431 * This funciton is called on module load in order to register the driver.
433 int fm10k_register_pci_driver(void)
435 return pci_register_driver(&fm10k_driver);
439 * fm10k_unregister_pci_driver - unregister driver interface
441 * This funciton is called on module unload in order to remove the driver.
443 void fm10k_unregister_pci_driver(void)
445 pci_unregister_driver(&fm10k_driver);