Annotation of Gnu-Mach/linux/pcmcia-cs/include/pcmcia/mem_op.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * mem_op.h 1.14 2001/08/24 12:16:13
        !             3:  *
        !             4:  * The contents of this file are subject to the Mozilla Public License
        !             5:  * Version 1.1 (the "License"); you may not use this file except in
        !             6:  * compliance with the License. You may obtain a copy of the License
        !             7:  * at http://www.mozilla.org/MPL/
        !             8:  *
        !             9:  * Software distributed under the License is distributed on an "AS IS"
        !            10:  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
        !            11:  * the License for the specific language governing rights and
        !            12:  * limitations under the License. 
        !            13:  *
        !            14:  * The initial developer of the original code is David A. Hinds
        !            15:  * <[email protected]>.  Portions created by David A. Hinds
        !            16:  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
        !            17:  *
        !            18:  * Alternatively, the contents of this file may be used under the
        !            19:  * terms of the GNU General Public License version 2 (the "GPL"), in
        !            20:  * which case the provisions of the GPL are applicable instead of the
        !            21:  * above.  If you wish to allow the use of your version of this file
        !            22:  * only under the terms of the GPL and not to allow others to use
        !            23:  * your version of this file under the MPL, indicate your decision by
        !            24:  * deleting the provisions above and replace them with the notice and
        !            25:  * other provisions required by the GPL.  If you do not delete the
        !            26:  * provisions above, a recipient may use your version of this file
        !            27:  * under either the MPL or the GPL.
        !            28:  */
        !            29: 
        !            30: #ifndef _LINUX_MEM_OP_H
        !            31: #define _LINUX_MEM_OP_H
        !            32: 
        !            33: #include <asm/uaccess.h>
        !            34: 
        !            35: /*
        !            36:    If UNSAFE_MEMCPY is defined, we use the (optimized) system routines
        !            37:    to copy between a card and kernel memory.  These routines do 32-bit
        !            38:    operations which may not work with all PCMCIA controllers.  The
        !            39:    safe versions defined here will do only 8-bit and 16-bit accesses.
        !            40: */
        !            41: 
        !            42: #ifdef UNSAFE_MEMCPY
        !            43: 
        !            44: #define copy_from_pc memcpy_fromio
        !            45: #define copy_to_pc memcpy_toio
        !            46: 
        !            47: static inline void copy_pc_to_user(void *to, const void *from, size_t n)
        !            48: {
        !            49:     size_t odd = (n & 3);
        !            50:     n -= odd;
        !            51:     while (n) {
        !            52:        put_user(readl_ns(from), (int *)to);
        !            53:        from += 4; to += 4; n -= 4;
        !            54:     }
        !            55:     while (odd--)
        !            56:        put_user(readb((char *)from++), (char *)to++);
        !            57: }
        !            58: 
        !            59: static inline void copy_user_to_pc(void *to, const void *from, size_t n)
        !            60: {
        !            61:     int l;
        !            62:     char c;
        !            63:     size_t odd = (n & 3);
        !            64:     n -= odd;
        !            65:     while (n) {
        !            66:         l = get_user((int *)from);
        !            67:        writel_ns(l, to);
        !            68:        to += 4; from += 4; n -= 4;
        !            69:     }
        !            70:     while (odd--) {
        !            71:        c = get_user((char *)from++);
        !            72:        writeb(c, (char *)to++);
        !            73:     }
        !            74: }
        !            75: 
        !            76: #else /* UNSAFE_MEMCPY */
        !            77: 
        !            78: static inline void copy_from_pc(void *to, const void *from, size_t n)
        !            79: {
        !            80:     size_t odd = (n & 1);
        !            81:     n -= odd;
        !            82:     while (n) {
        !            83:        *(u_short *)to = readw_ns(from);
        !            84:        to += 2; from += 2; n -= 2;
        !            85:     }
        !            86:     if (odd)
        !            87:        *(u_char *)to = readb(from);
        !            88: }
        !            89: 
        !            90: static inline void copy_to_pc(void *to, const void *from, size_t n)
        !            91: {
        !            92:     size_t odd = (n & 1);
        !            93:     n -= odd;
        !            94:     while (n) {
        !            95:        writew_ns(*(u_short *)from, to);
        !            96:        to += 2; from += 2; n -= 2;
        !            97:     }
        !            98:     if (odd)
        !            99:        writeb(*(u_char *)from, to);
        !           100: }
        !           101: 
        !           102: static inline void copy_pc_to_user(void *to, const void *from, size_t n)
        !           103: {
        !           104:     size_t odd = (n & 1);
        !           105:     n -= odd;
        !           106:     while (n) {
        !           107:        put_user(readw_ns(from), (short *)to);
        !           108:        to += 2; from += 2; n -= 2;
        !           109:     }
        !           110:     if (odd)
        !           111:        put_user(readb(from), (char *)to);
        !           112: }
        !           113: 
        !           114: static inline void copy_user_to_pc(void *to, const void *from, size_t n)
        !           115: {
        !           116:     short s;
        !           117:     char c;
        !           118:     size_t odd = (n & 1);
        !           119:     n -= odd;
        !           120:     while (n) {
        !           121:        s = get_user((short *)from);
        !           122:        writew_ns(s, to);
        !           123:        to += 2; from += 2; n -= 2;
        !           124:     }
        !           125:     if (odd) {
        !           126:        c = get_user((char *)from);
        !           127:        writeb(c, to);
        !           128:     }
        !           129: }
        !           130: 
        !           131: #endif /* UNSAFE_MEMCPY */
        !           132: 
        !           133: #endif /* _LINUX_MEM_OP_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.