From 2ea3aaed738c2307e7430c7270e3a6699178193a Mon Sep 17 00:00:00 2001
From: jogo <jogo@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Thu, 19 Jan 2012 19:51:54 +0000
Subject: [PATCH] kernel: fix OCF for linux 3.2

Add skb_frag_page from 3.2 to OCF for 3.1 and earlier and use it.

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@29818 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/kernel/modules/crypto.mk                         | 2 +-
 target/linux/generic/files/crypto/ocf/c7108/aes-7108.c   | 4 ++--
 target/linux/generic/files/crypto/ocf/criov.c            | 2 +-
 .../generic/files/crypto/ocf/cryptocteon/cryptocteon.c   | 2 +-
 target/linux/generic/files/crypto/ocf/cryptosoft.c       | 2 +-
 target/linux/generic/files/crypto/ocf/hifn/hifn7751.c    | 2 +-
 target/linux/generic/files/crypto/ocf/ocf-compat.h       | 9 +++++++++
 target/linux/generic/files/crypto/ocf/safe/safe.c        | 2 +-
 .../linux/generic/files/crypto/ocf/ubsec_ssb/ubsec_ssb.c | 6 +++---
 9 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/package/kernel/modules/crypto.mk b/package/kernel/modules/crypto.mk
index 44c4b5d7b..c8be6f946 100644
--- a/package/kernel/modules/crypto.mk
+++ b/package/kernel/modules/crypto.mk
@@ -401,7 +401,7 @@ $(eval $(call KernelPackage,crypto-misc))
 
 define KernelPackage/crypto-ocf
   TITLE:=OCF modules
-  DEPENDS:=+@OPENSSL_ENGINE @!TARGET_uml +kmod-crypto-manager @!LINUX_3_2||BROKEN
+  DEPENDS:=+@OPENSSL_ENGINE @!TARGET_uml +kmod-crypto-manager
   KCONFIG:= \
 	CONFIG_OCF_OCF \
 	CONFIG_OCF_CRYPTODEV \
diff --git a/target/linux/generic/files/crypto/ocf/c7108/aes-7108.c b/target/linux/generic/files/crypto/ocf/c7108/aes-7108.c
index a5ac05495..d03540b64 100644
--- a/target/linux/generic/files/crypto/ocf/c7108/aes-7108.c
+++ b/target/linux/generic/files/crypto/ocf/c7108/aes-7108.c
@@ -592,13 +592,13 @@ c7108_process(void *arg, struct cryptop *crp, int hint)
 			 i < skb_shinfo(skb)->nr_frags &&
 			 sg_num < SCATTERLIST_MAX; i++) {
 		    if (skip < skb_shinfo(skb)->frags[i].size) {
-			//sg[sg_num].page   = skb_shinfo(skb)->frags[i].page;
+			//sg[sg_num].page   = skb_frag_page(&kb_shinfo(skb)->frags[i]);
 			//sg[sg_num].offset = skb_shinfo(skb)->frags[i].page_offset + skip;
 			len = skb_shinfo(skb)->frags[i].size - skip;
 			if (len + sg_len > crd->crd_len)
 			    len = crd->crd_len - sg_len;
 			//sg[sg_num].length = len;
-			sg_set_page(&sg[sg_num], skb_shinfo(skb)->frags[i].page, len, skb_shinfo(skb)->frags[i].page_offset + skip);
+			sg_set_page(&sg[sg_num], skb_frag_page(&skb_shinfo(skb)->frags[i]), len, skb_shinfo(skb)->frags[i].page_offset + skip);
 			sg_len += sg[sg_num].length;
 			sg_num++;
 			skip = 0;
diff --git a/target/linux/generic/files/crypto/ocf/criov.c b/target/linux/generic/files/crypto/ocf/criov.c
index d3d8cfd8f..cdc731e29 100644
--- a/target/linux/generic/files/crypto/ocf/criov.c
+++ b/target/linux/generic/files/crypto/ocf/criov.c
@@ -156,7 +156,7 @@ skb_copy_bits_back(struct sk_buff *skb, int offset, caddr_t cp, int len)
 	offset -= skb_headlen(skb);
 	for (i = 0; len > 0 && i < skb_shinfo(skb)->nr_frags; i++) {
 		if (offset < skb_shinfo(skb)->frags[i].size) {
-			memcpy(page_address(skb_shinfo(skb)->frags[i].page) +
+			memcpy(page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
 					skb_shinfo(skb)->frags[i].page_offset,
 					cp, min_t(int, skb_shinfo(skb)->frags[i].size, len));
 			len -= skb_shinfo(skb)->frags[i].size;
diff --git a/target/linux/generic/files/crypto/ocf/cryptocteon/cryptocteon.c b/target/linux/generic/files/crypto/ocf/cryptocteon/cryptocteon.c
index 741e4fa31..b0c10a295 100644
--- a/target/linux/generic/files/crypto/ocf/cryptocteon/cryptocteon.c
+++ b/target/linux/generic/files/crypto/ocf/cryptocteon/cryptocteon.c
@@ -473,7 +473,7 @@ octo_process(device_t dev, struct cryptop *crp, int hint)
 		for (i = 0; i < skb_shinfo(skb)->nr_frags && sg_num < SCATTERLIST_MAX;
 				i++) {
 			len = skb_shinfo(skb)->frags[i].size;
-			sg_set_page(&sg[sg_num], skb_shinfo(skb)->frags[i].page,
+			sg_set_page(&sg[sg_num], skb_frag_page(&skb_shinfo(skb)->frags[i]),
 					len, skb_shinfo(skb)->frags[i].page_offset);
 			sg_len += len;
 			sg_num++;
diff --git a/target/linux/generic/files/crypto/ocf/cryptosoft.c b/target/linux/generic/files/crypto/ocf/cryptosoft.c
index 79aac9236..f9ecdf927 100644
--- a/target/linux/generic/files/crypto/ocf/cryptosoft.c
+++ b/target/linux/generic/files/crypto/ocf/cryptosoft.c
@@ -777,7 +777,7 @@ static void swcr_process_req(struct swcr_req *req)
 				if (len + sg_len > crd->crd_len)
 					len = crd->crd_len - sg_len;
 				sg_set_page(&req->sg[sg_num],
-					skb_shinfo(skb)->frags[i].page,
+					skb_frag_page(&skb_shinfo(skb)->frags[i]),
 					len,
 					skb_shinfo(skb)->frags[i].page_offset + skip);
 				sg_len += len;
diff --git a/target/linux/generic/files/crypto/ocf/hifn/hifn7751.c b/target/linux/generic/files/crypto/ocf/hifn/hifn7751.c
index 4803a83a5..b7df81907 100644
--- a/target/linux/generic/files/crypto/ocf/hifn/hifn7751.c
+++ b/target/linux/generic/files/crypto/ocf/hifn/hifn7751.c
@@ -241,7 +241,7 @@ pci_map_skb(struct hifn_softc *sc,struct hifn_operand *buf,struct sk_buff *skb)
 	for (i = 0; i < skb_shinfo(skb)->nr_frags; ) {
 		buf->segs[buf->nsegs].ds_len = skb_shinfo(skb)->frags[i].size;
 		buf->segs[buf->nsegs].ds_addr = pci_map_single(sc->sc_pcidev,
-				page_address(skb_shinfo(skb)->frags[i].page) +
+				page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
 					skb_shinfo(skb)->frags[i].page_offset,
 				buf->segs[buf->nsegs].ds_len, PCI_DMA_BIDIRECTIONAL);
 		buf->mapsize += buf->segs[buf->nsegs].ds_len;
diff --git a/target/linux/generic/files/crypto/ocf/ocf-compat.h b/target/linux/generic/files/crypto/ocf/ocf-compat.h
index 2d985360f..b76c369dd 100644
--- a/target/linux/generic/files/crypto/ocf/ocf-compat.h
+++ b/target/linux/generic/files/crypto/ocf/ocf-compat.h
@@ -359,6 +359,15 @@ static inline int ocf_run_thread(void *arg)
 #include <linux/kthread.h>
 #endif
 
+#include <linux/skbuff.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
+static inline struct page *skb_frag_page(const skb_frag_t *frag)
+{
+	return frag->page;
+}
+#endif
+
 #endif /* __KERNEL__ */
 
 /****************************************************************************/
diff --git a/target/linux/generic/files/crypto/ocf/safe/safe.c b/target/linux/generic/files/crypto/ocf/safe/safe.c
index 189b95f60..7d9b54117 100644
--- a/target/linux/generic/files/crypto/ocf/safe/safe.c
+++ b/target/linux/generic/files/crypto/ocf/safe/safe.c
@@ -208,7 +208,7 @@ pci_map_skb(struct safe_softc *sc,struct safe_operand *buf,struct sk_buff *skb)
 
 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 		pci_map_linear(sc, buf,
-				page_address(skb_shinfo(skb)->frags[i].page) +
+				page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
 				                        skb_shinfo(skb)->frags[i].page_offset,
 				skb_shinfo(skb)->frags[i].size);
 	}
diff --git a/target/linux/generic/files/crypto/ocf/ubsec_ssb/ubsec_ssb.c b/target/linux/generic/files/crypto/ocf/ubsec_ssb/ubsec_ssb.c
index aa0733f08..f5d776236 100644
--- a/target/linux/generic/files/crypto/ocf/ubsec_ssb/ubsec_ssb.c
+++ b/target/linux/generic/files/crypto/ocf/ubsec_ssb/ubsec_ssb.c
@@ -297,18 +297,18 @@ dma_map_skb(struct ubsec_softc *sc, struct ubsec_dma_alloc* q_map, struct sk_buf
 
 #ifdef UBSEC_VERBOSE_DEBUG
         DPRINTF("%s - map %d 0x%x %d\n", __FUNCTION__, i + 1, 
-            (unsigned int)page_address(skb_shinfo(skb)->frags[i].page) +
+            (unsigned int)page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
             skb_shinfo(skb)->frags[i].page_offset, skb_shinfo(skb)->frags[i].size);
 #endif
 
         tmp = dma_map_single(sc->sc_dv,
-                             page_address(skb_shinfo(skb)->frags[i].page) +
+                             page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
                                  skb_shinfo(skb)->frags[i].page_offset, 
                              skb_shinfo(skb)->frags[i].size,
                              DMA_BIDIRECTIONAL);
 
         q_map[i + 1].dma_paddr = tmp;
-        q_map[i + 1].dma_vaddr = (void*)(page_address(skb_shinfo(skb)->frags[i].page) +
+        q_map[i + 1].dma_vaddr = (void*)(page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
                                   skb_shinfo(skb)->frags[i].page_offset);
         q_map[i + 1].dma_size = skb_shinfo(skb)->frags[i].size;
 
-- 
2.20.1