}
 
 /* Read TLS header to find content type and data length */
-static u16 tls_header_read(struct tls_hdr *thdr, struct iov_iter *from)
+static int tls_header_read(struct tls_hdr *thdr, struct iov_iter *from)
 {
        if (copy_from_iter(thdr, sizeof(*thdr), from) != sizeof(*thdr))
                return -EFAULT;
-       return (__force u16)cpu_to_be16(thdr->length);
+       return (__force int)cpu_to_be16(thdr->length);
 }
 
 static int csk_mem_free(struct chtls_dev *cdev, struct sock *sk)
                        int off = TCP_OFF(sk);
                        bool merge;
 
-                       if (page)
-                               pg_size <<= compound_order(page);
+                       if (!page)
+                               goto wait_for_memory;
 
+                       pg_size <<= compound_order(page);
                        if (off < pg_size &&
                            skb_can_coalesce(skb, i, page, off)) {
                                merge = 1;
                        break;
                chtls_cleanup_rbuf(sk, copied);
                sk_wait_data(sk, &timeo, NULL);
-                       continue;
+               continue;
 found_ok_skb:
                if (!skb->len) {
                        skb_dst_set(skb, NULL);