|
@@ -129,6 +129,7 @@
|
|
#include <linux/jhash.h>
|
|
#include <linux/jhash.h>
|
|
#include <linux/random.h>
|
|
#include <linux/random.h>
|
|
#include <trace/events/napi.h>
|
|
#include <trace/events/napi.h>
|
|
|
|
+#include <linux/pci.h>
|
|
|
|
|
|
#include "net-sysfs.h"
|
|
#include "net-sysfs.h"
|
|
|
|
|
|
@@ -1804,14 +1805,21 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
|
|
{
|
|
{
|
|
#ifdef CONFIG_HIGHMEM
|
|
#ifdef CONFIG_HIGHMEM
|
|
int i;
|
|
int i;
|
|
|
|
+ if (!(dev->features & NETIF_F_HIGHDMA)) {
|
|
|
|
+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
|
|
|
|
+ if (PageHighMem(skb_shinfo(skb)->frags[i].page))
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
|
|
- if (dev->features & NETIF_F_HIGHDMA)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
|
|
|
|
- if (PageHighMem(skb_shinfo(skb)->frags[i].page))
|
|
|
|
- return 1;
|
|
|
|
|
|
+ if (PCI_DMA_BUS_IS_PHYS) {
|
|
|
|
+ struct device *pdev = dev->dev.parent;
|
|
|
|
|
|
|
|
+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
|
|
+ dma_addr_t addr = page_to_phys(skb_shinfo(skb)->frags[i].page);
|
|
|
|
+ if (!pdev->dma_mask || addr + PAGE_SIZE - 1 > *pdev->dma_mask)
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|