linux/drivers/scsi/lpfc/lpfc_compat.h
<<
>>
Prefs
   1/*******************************************************************
   2 * This file is part of the Emulex Linux Device Driver for         *
   3 * Fibre Channel Host Bus Adapters.                                *
   4 * Copyright (C) 2004-2011 Emulex.  All rights reserved.           *
   5 * EMULEX and SLI are trademarks of Emulex.                        *
   6 * www.emulex.com                                                  *
   7 *                                                                 *
   8 * This program is free software; you can redistribute it and/or   *
   9 * modify it under the terms of version 2 of the GNU General       *
  10 * Public License as published by the Free Software Foundation.    *
  11 * This program is distributed in the hope that it will be useful. *
  12 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
  13 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
  14 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
  15 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  16 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
  17 * more details, a copy of which can be found in the file COPYING  *
  18 * included with this package.                                     *
  19 *******************************************************************/
  20
  21/*
  22 * This file provides macros to aid compilation in the Linux 2.4 kernel
  23 * over various platform architectures.
  24 */
  25
  26/*******************************************************************
  27Note: HBA's SLI memory contains little-endian LW.
  28Thus to access it from a little-endian host,
  29memcpy_toio() and memcpy_fromio() can be used.
  30However on a big-endian host, copy 4 bytes at a time,
  31using writel() and readl().
  32 *******************************************************************/
  33#include <asm/byteorder.h>
  34
  35#ifdef __BIG_ENDIAN
  36
  37static inline void
  38lpfc_memcpy_to_slim(void __iomem *dest, void *src, unsigned int bytes)
  39{
  40        uint32_t __iomem *dest32;
  41        uint32_t *src32;
  42        unsigned int four_bytes;
  43
  44
  45        dest32  = (uint32_t __iomem *) dest;
  46        src32  = (uint32_t *) src;
  47
  48        /* write input bytes, 4 bytes at a time */
  49        for (four_bytes = bytes /4; four_bytes > 0; four_bytes--) {
  50                writel( *src32, dest32);
  51                readl(dest32); /* flush */
  52                dest32++;
  53                src32++;
  54        }
  55
  56        return;
  57}
  58
  59static inline void
  60lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes)
  61{
  62        uint32_t *dest32;
  63        uint32_t __iomem *src32;
  64        unsigned int four_bytes;
  65
  66
  67        dest32  = (uint32_t *) dest;
  68        src32  = (uint32_t __iomem *) src;
  69
  70        /* read input bytes, 4 bytes at a time */
  71        for (four_bytes = bytes /4; four_bytes > 0; four_bytes--) {
  72                *dest32 = readl( src32);
  73                dest32++;
  74                src32++;
  75        }
  76
  77        return;
  78}
  79
  80#else
  81
  82static inline void
  83lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes)
  84{
  85        /* convert bytes in argument list to word count for copy function */
  86        __iowrite32_copy(dest, src, bytes / sizeof(uint32_t));
  87}
  88
  89static inline void
  90lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes)
  91{
  92        /* actually returns 1 byte past dest */
  93        memcpy_fromio( dest, src, bytes);
  94}
  95
  96#endif  /* __BIG_ENDIAN */
  97