1/* $Id: platform.h,v 1.1.1.1 2007/08/03 18:52:35 Exp $ 2 * 3 * platform.h 4 * 5 * 6 * Copyright 2000-2003 by Armin Schindler (mac@melware.de) 7 * Copyright 2000 Eicon Networks 8 * 9 * This software may be used and distributed according to the terms 10 * of the GNU General Public License, incorporated herein by reference. 11 */ 12 13 14#ifndef __PLATFORM_H__ 15#define __PLATFORM_H__ 16 17#if !defined(DIVA_BUILD) 18#define DIVA_BUILD "local" 19#endif 20 21#include <linux/module.h> 22#include <linux/init.h> 23#include <linux/kernel.h> 24#include <linux/sched.h> 25#include <linux/skbuff.h> 26#include <linux/vmalloc.h> 27#include <linux/proc_fs.h> 28#include <linux/interrupt.h> 29#include <linux/delay.h> 30#include <linux/list.h> 31#include <asm/types.h> 32#include <asm/io.h> 33 34#include "cardtype.h" 35 36/* activate debuglib for modules only */ 37#ifndef MODULE 38#define DIVA_NO_DEBUGLIB 39#endif 40 41#define DIVA_INIT_FUNCTION __init 42#define DIVA_EXIT_FUNCTION __exit 43 44#define DIVA_USER_MODE_CARD_CONFIG 1 45#define USE_EXTENDED_DEBUGS 1 46 47#define MAX_ADAPTER 32 48 49#define DIVA_ISTREAM 1 50 51#define MEMORY_SPACE_TYPE 0 52#define PORT_SPACE_TYPE 1 53 54 55#include <linux/string.h> 56 57#ifndef byte 58#define byte u8 59#endif 60 61#ifndef word 62#define word u16 63#endif 64 65#ifndef dword 66#define dword u32 67#endif 68 69#ifndef qword 70#define qword u64 71#endif 72 73#ifndef NULL 74#define NULL ((void *) 0) 75#endif 76 77#ifndef far 78#define far 79#endif 80 81#ifndef _pascal 82#define _pascal 83#endif 84 85#ifndef _loadds 86#define _loadds 87#endif 88 89#ifndef _cdecl 90#define _cdecl 91#endif 92 93#define MEM_TYPE_RAM 0 94#define MEM_TYPE_PORT 1 95#define MEM_TYPE_PROM 2 96#define MEM_TYPE_CTLREG 3 97#define MEM_TYPE_RESET 4 98#define MEM_TYPE_CFG 5 99#define MEM_TYPE_ADDRESS 6 100#define MEM_TYPE_CONFIG 7 101#define MEM_TYPE_CONTROL 8 102 103#define MAX_MEM_TYPE 10 104 105#define DIVA_OS_MEM_ATTACH_RAM(a) ((a)->ram) 106#define DIVA_OS_MEM_ATTACH_PORT(a) ((a)->port) 107#define DIVA_OS_MEM_ATTACH_PROM(a) ((a)->prom) 108#define DIVA_OS_MEM_ATTACH_CTLREG(a) ((a)->ctlReg) 109#define DIVA_OS_MEM_ATTACH_RESET(a) ((a)->reset) 110#define DIVA_OS_MEM_ATTACH_CFG(a) ((a)->cfg) 111#define DIVA_OS_MEM_ATTACH_ADDRESS(a) ((a)->Address) 112#define DIVA_OS_MEM_ATTACH_CONFIG(a) ((a)->Config) 113#define DIVA_OS_MEM_ATTACH_CONTROL(a) ((a)->Control) 114 115#define DIVA_OS_MEM_DETACH_RAM(a, x) do { } while(0) 116#define DIVA_OS_MEM_DETACH_PORT(a, x) do { } while(0) 117#define DIVA_OS_MEM_DETACH_PROM(a, x) do { } while(0) 118#define DIVA_OS_MEM_DETACH_CTLREG(a, x) do { } while(0) 119#define DIVA_OS_MEM_DETACH_RESET(a, x) do { } while(0) 120#define DIVA_OS_MEM_DETACH_CFG(a, x) do { } while(0) 121#define DIVA_OS_MEM_DETACH_ADDRESS(a, x) do { } while(0) 122#define DIVA_OS_MEM_DETACH_CONFIG(a, x) do { } while(0) 123#define DIVA_OS_MEM_DETACH_CONTROL(a, x) do { } while(0) 124 125#define DIVA_INVALID_FILE_HANDLE ((dword)(-1)) 126 127#define DIVAS_CONTAINING_RECORD(address, type, field) \ 128 ((type *)((char*)(address) - (char*)(&((type *)0)->field))) 129 130extern int sprintf(char *, const char*, ...); 131 132typedef void* LIST_ENTRY; 133 134typedef char DEVICE_NAME[64]; 135typedef struct _ISDN_ADAPTER ISDN_ADAPTER; 136typedef struct _ISDN_ADAPTER* PISDN_ADAPTER; 137 138typedef void (* DIVA_DI_PRINTF) (unsigned char *, ...); 139#include "debuglib.h" 140 141#define dtrc(p) DBG_PRV0(p) 142#define dbug(a,p) DBG_PRV1(p) 143 144 145typedef struct e_info_s E_INFO ; 146 147typedef char diva_os_dependent_devica_name_t[64]; 148typedef void* PDEVICE_OBJECT; 149 150struct _diva_os_soft_isr; 151struct _diva_os_timer; 152struct _ISDN_ADAPTER; 153 154void diva_log_info(unsigned char *, ...); 155 156/* 157** XDI DIDD Interface 158*/ 159void diva_xdi_didd_register_adapter (int card); 160void diva_xdi_didd_remove_adapter (int card); 161 162/* 163** memory allocation 164*/ 165static __inline__ void* diva_os_malloc (unsigned long flags, unsigned long size) 166{ 167 void *ret = NULL; 168 169 if (size) { 170 ret = (void *) vmalloc((unsigned int) size); 171 } 172 return (ret); 173} 174static __inline__ void diva_os_free (unsigned long flags, void* ptr) 175{ 176 vfree(ptr); 177} 178 179/* 180** use skbuffs for message buffer 181*/ 182typedef struct sk_buff diva_os_message_buffer_s; 183diva_os_message_buffer_s *diva_os_alloc_message_buffer(unsigned long size, void **data_buf); 184void diva_os_free_message_buffer(diva_os_message_buffer_s *dmb); 185#define DIVA_MESSAGE_BUFFER_LEN(x) x->len 186#define DIVA_MESSAGE_BUFFER_DATA(x) x->data 187 188/* 189** mSeconds waiting 190*/ 191static __inline__ void diva_os_sleep(dword mSec) 192{ 193 msleep(mSec); 194} 195static __inline__ void diva_os_wait(dword mSec) 196{ 197 mdelay(mSec); 198} 199 200/* 201** PCI Configuration space access 202*/ 203void PCIwrite (byte bus, byte func, int offset, void* data, int length, void* pci_dev_handle); 204void PCIread (byte bus, byte func, int offset, void* data, int length, void* pci_dev_handle); 205 206/* 207** I/O Port utilities 208*/ 209int diva_os_register_io_port (void *adapter, int register, unsigned long port, 210 unsigned long length, const char* name, int id); 211/* 212** I/O port access abstraction 213*/ 214byte inpp (void __iomem *); 215word inppw (void __iomem *); 216void inppw_buffer (void __iomem *, void*, int); 217void outppw (void __iomem *, word); 218void outppw_buffer (void __iomem * , void*, int); 219void outpp (void __iomem *, word); 220 221/* 222** IRQ 223*/ 224typedef struct _diva_os_adapter_irq_info { 225 byte irq_nr; 226 int registered; 227 char irq_name[24]; 228} diva_os_adapter_irq_info_t; 229int diva_os_register_irq (void* context, byte irq, const char* name); 230void diva_os_remove_irq (void* context, byte irq); 231 232#define diva_os_in_irq() in_irq() 233 234/* 235** Spin Lock framework 236*/ 237typedef long diva_os_spin_lock_magic_t; 238typedef spinlock_t diva_os_spin_lock_t; 239static __inline__ int diva_os_initialize_spin_lock (spinlock_t *lock, void * unused) { \ 240 spin_lock_init (lock); return(0); } 241static __inline__ void diva_os_enter_spin_lock (diva_os_spin_lock_t* a, \ 242 diva_os_spin_lock_magic_t* old_irql, \ 243 void* dbg) { spin_lock_bh(a); } 244static __inline__ void diva_os_leave_spin_lock (diva_os_spin_lock_t* a, \ 245 diva_os_spin_lock_magic_t* old_irql, \ 246 void* dbg) { spin_unlock_bh(a); } 247 248#define diva_os_destroy_spin_lock(a,b) do { } while(0) 249 250/* 251** Deffered processing framework 252*/ 253typedef int (*diva_os_isr_callback_t)(struct _ISDN_ADAPTER*); 254typedef void (*diva_os_soft_isr_callback_t)(struct _diva_os_soft_isr* psoft_isr, void* context); 255 256typedef struct _diva_os_soft_isr { 257 void* object; 258 diva_os_soft_isr_callback_t callback; 259 void* callback_context; 260 char dpc_thread_name[24]; 261} diva_os_soft_isr_t; 262 263int diva_os_initialize_soft_isr (diva_os_soft_isr_t* psoft_isr, diva_os_soft_isr_callback_t callback, void* callback_context); 264int diva_os_schedule_soft_isr (diva_os_soft_isr_t* psoft_isr); 265int diva_os_cancel_soft_isr (diva_os_soft_isr_t* psoft_isr); 266void diva_os_remove_soft_isr (diva_os_soft_isr_t* psoft_isr); 267 268/* 269 Get time service 270 */ 271void diva_os_get_time (dword* sec, dword* usec); 272 273/* 274** atomic operation, fake because we use threads 275*/ 276typedef int diva_os_atomic_t; 277static diva_os_atomic_t __inline__ 278diva_os_atomic_increment(diva_os_atomic_t* pv) 279{ 280 *pv += 1; 281 return (*pv); 282} 283static diva_os_atomic_t __inline__ 284diva_os_atomic_decrement(diva_os_atomic_t* pv) 285{ 286 *pv -= 1; 287 return (*pv); 288} 289 290/* 291** CAPI SECTION 292*/ 293#define NO_CORNETN 294#define IMPLEMENT_DTMF 1 295#define IMPLEMENT_ECHO_CANCELLER 1 296#define IMPLEMENT_RTP 1 297#define IMPLEMENT_T38 1 298#define IMPLEMENT_FAX_SUB_SEP_PWD 1 299#define IMPLEMENT_V18 1 300#define IMPLEMENT_DTMF_TONE 1 301#define IMPLEMENT_PIAFS 1 302#define IMPLEMENT_FAX_PAPER_FORMATS 1 303#define IMPLEMENT_VOWN 1 304#define IMPLEMENT_CAPIDTMF 1 305#define IMPLEMENT_FAX_NONSTANDARD 1 306#define VSWITCH_SUPPORT 1 307 308#define IMPLEMENT_MARKED_OK_AFTER_FC 1 309 310#define DIVA_IDI_RX_DMA 1 311 312/* 313** endian macros 314** 315** If only... In some cases we did use them for endianness conversion; 316** unfortunately, other uses were real iomem accesses. 317*/ 318#define READ_BYTE(addr) readb(addr) 319#define READ_WORD(addr) readw(addr) 320#define READ_DWORD(addr) readl(addr) 321 322#define WRITE_BYTE(addr,v) writeb(v,addr) 323#define WRITE_WORD(addr,v) writew(v,addr) 324#define WRITE_DWORD(addr,v) writel(v,addr) 325 326static inline __u16 GET_WORD(void *addr) 327{ 328 return le16_to_cpu(*(__le16 *)addr); 329} 330static inline __u32 GET_DWORD(void *addr) 331{ 332 return le32_to_cpu(*(__le32 *)addr); 333} 334static inline void PUT_WORD(void *addr, __u16 v) 335{ 336 *(__le16 *)addr = cpu_to_le16(v); 337} 338static inline void PUT_DWORD(void *addr, __u32 v) 339{ 340 *(__le32 *)addr = cpu_to_le32(v); 341} 342 343/* 344** 32/64 bit macors 345*/ 346#ifdef BITS_PER_LONG 347 #if BITS_PER_LONG > 32 348 #define PLATFORM_GT_32BIT 349 #define ULongToPtr(x) (void *)(unsigned long)(x) 350 #endif 351#endif 352 353/* 354** undef os definitions of macros we use 355*/ 356#undef ID_MASK 357#undef N_DATA 358#undef ADDR 359 360/* 361** dump file 362*/ 363#define diva_os_dump_file_t char 364#define diva_os_board_trace_t char 365#define diva_os_dump_file(__x__) do { } while(0) 366 367/* 368** size of internal arrays 369*/ 370#define MAX_DESCRIPTORS 64 371 372#endif /* __PLATFORM_H__ */ 373