fm10k: Add support for basic interaction with hardware
[deliverable/linux.git] / drivers / net / ethernet / intel / fm10k / fm10k_pci.c
CommitLineData
b3890e30
AD
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/**
26 * fm10k_pci_tbl - PCI Device ID Table
27 *
28 * Wildcard entries (PCI_ANY_ID) should come last
29 * Last entry must be all 0s
30 *
31 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
32 * Class, Class Mask, private data (not used) }
33 */
34static const struct pci_device_id fm10k_pci_tbl[] = {
35 { PCI_VDEVICE(INTEL, FM10K_DEV_ID_PF) },
36 /* required last entry */
37 { 0, }
38};
39MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl);
40
04a5aefb
AD
41u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg)
42{
43 struct fm10k_intfc *interface = hw->back;
44 u16 value = 0;
45
46 if (FM10K_REMOVED(hw->hw_addr))
47 return ~value;
48
49 pci_read_config_word(interface->pdev, reg, &value);
50 if (value == 0xFFFF)
51 fm10k_write_flush(hw);
52
53 return value;
54}
55
56u32 fm10k_read_reg(struct fm10k_hw *hw, int reg)
57{
58 u32 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr);
59 u32 value = 0;
60
61 if (FM10K_REMOVED(hw_addr))
62 return ~value;
63
64 value = readl(&hw_addr[reg]);
65 if (!(~value) && (!reg || !(~readl(hw_addr))))
66 hw->hw_addr = NULL;
67
68 return value;
69}
70
b3890e30
AD
71/**
72 * fm10k_probe - Device Initialization Routine
73 * @pdev: PCI device information struct
74 * @ent: entry in fm10k_pci_tbl
75 *
76 * Returns 0 on success, negative on failure
77 *
78 * fm10k_probe initializes an interface identified by a pci_dev structure.
79 * The OS initialization, configuring of the interface private structure,
80 * and a hardware reset occur.
81 **/
82static int fm10k_probe(struct pci_dev *pdev,
83 const struct pci_device_id *ent)
84{
85 int err;
86 u64 dma_mask;
87
88 err = pci_enable_device_mem(pdev);
89 if (err)
90 return err;
91
92 /* By default fm10k only supports a 48 bit DMA mask */
93 dma_mask = DMA_BIT_MASK(48) | dma_get_required_mask(&pdev->dev);
94
95 if ((dma_mask <= DMA_BIT_MASK(32)) ||
96 dma_set_mask_and_coherent(&pdev->dev, dma_mask)) {
97 dma_mask &= DMA_BIT_MASK(32);
98
99 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
100 err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
101 if (err) {
102 err = dma_set_coherent_mask(&pdev->dev,
103 DMA_BIT_MASK(32));
104 if (err) {
105 dev_err(&pdev->dev,
106 "No usable DMA configuration, aborting\n");
107 goto err_dma;
108 }
109 }
110 }
111
112 err = pci_request_selected_regions(pdev,
113 pci_select_bars(pdev,
114 IORESOURCE_MEM),
115 fm10k_driver_name);
116 if (err) {
117 dev_err(&pdev->dev,
118 "pci_request_selected_regions failed 0x%x\n", err);
119 goto err_pci_reg;
120 }
121
122 pci_set_master(pdev);
123 pci_save_state(pdev);
124
125 return 0;
126
127err_pci_reg:
128err_dma:
129 pci_disable_device(pdev);
130 return err;
131}
132
133/**
134 * fm10k_remove - Device Removal Routine
135 * @pdev: PCI device information struct
136 *
137 * fm10k_remove is called by the PCI subsystem to alert the driver
138 * that it should release a PCI device. The could be caused by a
139 * Hot-Plug event, or because the driver is going to be removed from
140 * memory.
141 **/
142static void fm10k_remove(struct pci_dev *pdev)
143{
144 pci_release_selected_regions(pdev,
145 pci_select_bars(pdev, IORESOURCE_MEM));
146
147 pci_disable_device(pdev);
148}
149
150static struct pci_driver fm10k_driver = {
151 .name = fm10k_driver_name,
152 .id_table = fm10k_pci_tbl,
153 .probe = fm10k_probe,
154 .remove = fm10k_remove,
155};
156
157/**
158 * fm10k_register_pci_driver - register driver interface
159 *
160 * This funciton is called on module load in order to register the driver.
161 **/
162int fm10k_register_pci_driver(void)
163{
164 return pci_register_driver(&fm10k_driver);
165}
166
167/**
168 * fm10k_unregister_pci_driver - unregister driver interface
169 *
170 * This funciton is called on module unload in order to remove the driver.
171 **/
172void fm10k_unregister_pci_driver(void)
173{
174 pci_unregister_driver(&fm10k_driver);
175}
This page took 0.029375 seconds and 5 git commands to generate.