diff options
Diffstat (limited to 'drivers/pci/iov.c')
-rw-r--r-- | drivers/pci/iov.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 2ae921f84bd3..5643a1011e23 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
@@ -19,16 +19,20 @@ | |||
19 | 19 | ||
20 | #define VIRTFN_ID_LEN 16 | 20 | #define VIRTFN_ID_LEN 16 |
21 | 21 | ||
22 | static inline u8 virtfn_bus(struct pci_dev *dev, int id) | 22 | int pci_iov_virtfn_bus(struct pci_dev *dev, int vf_id) |
23 | { | 23 | { |
24 | if (!dev->is_physfn) | ||
25 | return -EINVAL; | ||
24 | return dev->bus->number + ((dev->devfn + dev->sriov->offset + | 26 | return dev->bus->number + ((dev->devfn + dev->sriov->offset + |
25 | dev->sriov->stride * id) >> 8); | 27 | dev->sriov->stride * vf_id) >> 8); |
26 | } | 28 | } |
27 | 29 | ||
28 | static inline u8 virtfn_devfn(struct pci_dev *dev, int id) | 30 | int pci_iov_virtfn_devfn(struct pci_dev *dev, int vf_id) |
29 | { | 31 | { |
32 | if (!dev->is_physfn) | ||
33 | return -EINVAL; | ||
30 | return (dev->devfn + dev->sriov->offset + | 34 | return (dev->devfn + dev->sriov->offset + |
31 | dev->sriov->stride * id) & 0xff; | 35 | dev->sriov->stride * vf_id) & 0xff; |
32 | } | 36 | } |
33 | 37 | ||
34 | /* | 38 | /* |
@@ -58,11 +62,11 @@ static inline u8 virtfn_max_buses(struct pci_dev *dev) | |||
58 | struct pci_sriov *iov = dev->sriov; | 62 | struct pci_sriov *iov = dev->sriov; |
59 | int nr_virtfn; | 63 | int nr_virtfn; |
60 | u8 max = 0; | 64 | u8 max = 0; |
61 | u8 busnr; | 65 | int busnr; |
62 | 66 | ||
63 | for (nr_virtfn = 1; nr_virtfn <= iov->total_VFs; nr_virtfn++) { | 67 | for (nr_virtfn = 1; nr_virtfn <= iov->total_VFs; nr_virtfn++) { |
64 | pci_iov_set_numvfs(dev, nr_virtfn); | 68 | pci_iov_set_numvfs(dev, nr_virtfn); |
65 | busnr = virtfn_bus(dev, nr_virtfn - 1); | 69 | busnr = pci_iov_virtfn_bus(dev, nr_virtfn - 1); |
66 | if (busnr > max) | 70 | if (busnr > max) |
67 | max = busnr; | 71 | max = busnr; |
68 | } | 72 | } |
@@ -116,7 +120,7 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset) | |||
116 | struct pci_bus *bus; | 120 | struct pci_bus *bus; |
117 | 121 | ||
118 | mutex_lock(&iov->dev->sriov->lock); | 122 | mutex_lock(&iov->dev->sriov->lock); |
119 | bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id)); | 123 | bus = virtfn_add_bus(dev->bus, pci_iov_virtfn_bus(dev, id)); |
120 | if (!bus) | 124 | if (!bus) |
121 | goto failed; | 125 | goto failed; |
122 | 126 | ||
@@ -124,7 +128,7 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset) | |||
124 | if (!virtfn) | 128 | if (!virtfn) |
125 | goto failed0; | 129 | goto failed0; |
126 | 130 | ||
127 | virtfn->devfn = virtfn_devfn(dev, id); | 131 | virtfn->devfn = pci_iov_virtfn_devfn(dev, id); |
128 | virtfn->vendor = dev->vendor; | 132 | virtfn->vendor = dev->vendor; |
129 | pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device); | 133 | pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device); |
130 | pci_setup_device(virtfn); | 134 | pci_setup_device(virtfn); |
@@ -186,8 +190,8 @@ static void virtfn_remove(struct pci_dev *dev, int id, int reset) | |||
186 | struct pci_sriov *iov = dev->sriov; | 190 | struct pci_sriov *iov = dev->sriov; |
187 | 191 | ||
188 | virtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus), | 192 | virtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus), |
189 | virtfn_bus(dev, id), | 193 | pci_iov_virtfn_bus(dev, id), |
190 | virtfn_devfn(dev, id)); | 194 | pci_iov_virtfn_devfn(dev, id)); |
191 | if (!virtfn) | 195 | if (!virtfn) |
192 | return; | 196 | return; |
193 | 197 | ||
@@ -226,7 +230,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
226 | struct pci_dev *pdev; | 230 | struct pci_dev *pdev; |
227 | struct pci_sriov *iov = dev->sriov; | 231 | struct pci_sriov *iov = dev->sriov; |
228 | int bars = 0; | 232 | int bars = 0; |
229 | u8 bus; | 233 | int bus; |
230 | 234 | ||
231 | if (!nr_virtfn) | 235 | if (!nr_virtfn) |
232 | return 0; | 236 | return 0; |
@@ -263,7 +267,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
263 | iov->offset = offset; | 267 | iov->offset = offset; |
264 | iov->stride = stride; | 268 | iov->stride = stride; |
265 | 269 | ||
266 | bus = virtfn_bus(dev, nr_virtfn - 1); | 270 | bus = pci_iov_virtfn_bus(dev, nr_virtfn - 1); |
267 | if (bus > dev->bus->busn_res.end) { | 271 | if (bus > dev->bus->busn_res.end) { |
268 | dev_err(&dev->dev, "can't enable %d VFs (bus %02x out of range of %pR)\n", | 272 | dev_err(&dev->dev, "can't enable %d VFs (bus %02x out of range of %pR)\n", |
269 | nr_virtfn, bus, &dev->bus->busn_res); | 273 | nr_virtfn, bus, &dev->bus->busn_res); |