diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/setup-bus.c | 46 | ||||
-rw-r--r-- | drivers/pci/setup-res.c | 47 |
2 files changed, 46 insertions, 47 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c79ce4ee634b..f233d127ca89 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -137,6 +137,52 @@ static resource_size_t get_res_add_size(struct resource_list_x *realloc_head, | |||
137 | return 0; | 137 | return 0; |
138 | } | 138 | } |
139 | 139 | ||
140 | /* Sort resources by alignment */ | ||
141 | static void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | ||
142 | { | ||
143 | int i; | ||
144 | |||
145 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
146 | struct resource *r; | ||
147 | struct resource_list *list, *tmp; | ||
148 | resource_size_t r_align; | ||
149 | |||
150 | r = &dev->resource[i]; | ||
151 | |||
152 | if (r->flags & IORESOURCE_PCI_FIXED) | ||
153 | continue; | ||
154 | |||
155 | if (!(r->flags) || r->parent) | ||
156 | continue; | ||
157 | |||
158 | r_align = pci_resource_alignment(dev, r); | ||
159 | if (!r_align) { | ||
160 | dev_warn(&dev->dev, "BAR %d: %pR has bogus alignment\n", | ||
161 | i, r); | ||
162 | continue; | ||
163 | } | ||
164 | for (list = head; ; list = list->next) { | ||
165 | resource_size_t align = 0; | ||
166 | struct resource_list *ln = list->next; | ||
167 | |||
168 | if (ln) | ||
169 | align = pci_resource_alignment(ln->dev, ln->res); | ||
170 | |||
171 | if (r_align > align) { | ||
172 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
173 | if (!tmp) | ||
174 | panic("pdev_sort_resources(): " | ||
175 | "kmalloc() failed!\n"); | ||
176 | tmp->next = ln; | ||
177 | tmp->res = r; | ||
178 | tmp->dev = dev; | ||
179 | list->next = tmp; | ||
180 | break; | ||
181 | } | ||
182 | } | ||
183 | } | ||
184 | } | ||
185 | |||
140 | static void __dev_sort_resources(struct pci_dev *dev, | 186 | static void __dev_sort_resources(struct pci_dev *dev, |
141 | struct resource_list *head) | 187 | struct resource_list *head) |
142 | { | 188 | { |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 241de6c2b9cd..f968185aa192 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
@@ -302,53 +302,6 @@ int pci_assign_resource(struct pci_dev *dev, int resno) | |||
302 | return ret; | 302 | return ret; |
303 | } | 303 | } |
304 | 304 | ||
305 | |||
306 | /* Sort resources by alignment */ | ||
307 | void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | ||
308 | { | ||
309 | int i; | ||
310 | |||
311 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
312 | struct resource *r; | ||
313 | struct resource_list *list, *tmp; | ||
314 | resource_size_t r_align; | ||
315 | |||
316 | r = &dev->resource[i]; | ||
317 | |||
318 | if (r->flags & IORESOURCE_PCI_FIXED) | ||
319 | continue; | ||
320 | |||
321 | if (!(r->flags) || r->parent) | ||
322 | continue; | ||
323 | |||
324 | r_align = pci_resource_alignment(dev, r); | ||
325 | if (!r_align) { | ||
326 | dev_warn(&dev->dev, "BAR %d: %pR has bogus alignment\n", | ||
327 | i, r); | ||
328 | continue; | ||
329 | } | ||
330 | for (list = head; ; list = list->next) { | ||
331 | resource_size_t align = 0; | ||
332 | struct resource_list *ln = list->next; | ||
333 | |||
334 | if (ln) | ||
335 | align = pci_resource_alignment(ln->dev, ln->res); | ||
336 | |||
337 | if (r_align > align) { | ||
338 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
339 | if (!tmp) | ||
340 | panic("pdev_sort_resources(): " | ||
341 | "kmalloc() failed!\n"); | ||
342 | tmp->next = ln; | ||
343 | tmp->res = r; | ||
344 | tmp->dev = dev; | ||
345 | list->next = tmp; | ||
346 | break; | ||
347 | } | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | |||
352 | int pci_enable_resources(struct pci_dev *dev, int mask) | 305 | int pci_enable_resources(struct pci_dev *dev, int mask) |
353 | { | 306 | { |
354 | u16 cmd, old_cmd; | 307 | u16 cmd, old_cmd; |