v2.4.14.9 -> v2.4.15
[opensuse:kernel.git] / drivers / scsi / sym53c8xx_2 / sym_glue.h
1 /*
2  * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family 
3  * of PCI-SCSI IO processors.
4  *
5  * Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>
6  *
7  * This driver is derived from the Linux sym53c8xx driver.
8  * Copyright (C) 1998-2000  Gerard Roudier
9  *
10  * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 
11  * a port of the FreeBSD ncr driver to Linux-1.2.13.
12  *
13  * The original ncr driver has been written for 386bsd and FreeBSD by
14  *         Wolfgang Stanglmeier        <wolf@cologne.de>
15  *         Stefan Esser                <se@mi.Uni-Koeln.de>
16  * Copyright (C) 1994  Wolfgang Stanglmeier
17  *
18  * Other major contributions:
19  *
20  * NVRAM detection and reading.
21  * Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
22  *
23  *-----------------------------------------------------------------------------
24  *
25  * Redistribution and use in source and binary forms, with or without
26  * modification, are permitted provided that the following conditions
27  * are met:
28  * 1. Redistributions of source code must retain the above copyright
29  *    notice, this list of conditions and the following disclaimer.
30  * 2. The name of the author may not be used to endorse or promote products
31  *    derived from this software without specific prior written permission.
32  *
33  * Where this Software is combined with software released under the terms of 
34  * the GNU Public License ("GPL") and the terms of the GPL would require the 
35  * combined work to also be released under the terms of the GPL, the terms
36  * and conditions of this License will apply in addition to those of the
37  * GPL with the exception of any terms or conditions of this License that
38  * conflict with, or are expressly prohibited by, the GPL.
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
44  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  */
52
53 #ifndef SYM_GLUE_H
54 #define SYM_GLUE_H
55
56 #if 0
57 #define SYM_CONF_DMA_ADDRESSING_MODE 2
58 #endif
59
60 #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
61 #include <linux/version.h>
62 #if     LINUX_VERSION_CODE < LinuxVersionCode(2, 2, 0)
63 #error  "This driver requires a kernel version not lower than 2.2.0"
64 #endif
65
66 #include <asm/dma.h>
67 #include <asm/io.h>
68 #include <asm/system.h>
69 #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,17)
70 #include <linux/spinlock.h>
71 #else
72 #include <asm/spinlock.h>
73 #endif
74 #include <linux/delay.h>
75 #include <linux/signal.h>
76 #include <linux/sched.h>
77 #include <linux/errno.h>
78 #include <linux/pci.h>
79 #include <linux/string.h>
80 #include <linux/slab.h>
81 #include <linux/mm.h>
82 #include <linux/ioport.h>
83 #include <linux/time.h>
84 #include <linux/timer.h>
85 #include <linux/stat.h>
86
87 #include <linux/blk.h>
88
89 #ifdef __sparc__
90 #  include <asm/irq.h>
91 #endif
92 #include <linux/init.h>
93
94 #ifndef __init
95 #define __init
96 #endif
97 #ifndef __initdata
98 #define __initdata
99 #endif
100
101 #include "../scsi.h"
102 #include "../hosts.h"
103 #include "../constants.h"
104 #include "../sd.h"
105
106 #include <linux/types.h>
107
108 /*
109  *  Define BITS_PER_LONG for earlier linux versions.
110  */
111 #ifndef BITS_PER_LONG
112 #if (~0UL) == 0xffffffffUL
113 #define BITS_PER_LONG   32
114 #else
115 #define BITS_PER_LONG   64
116 #endif
117 #endif
118
119 typedef u_long  vm_offset_t;
120
121 #ifndef bcopy
122 #define bcopy(s, d, n)  memcpy((d), (s), (n))
123 #endif
124
125 #ifndef bzero
126 #define bzero(d, n)     memset((d), 0, (n))
127 #endif
128
129 #ifndef bcmp
130 #define bcmp(a, b, n)   memcmp((a), (b), (n))
131 #endif
132
133 /*
134  *  General driver includes.
135  */
136 #include "sym53c8xx.h"
137 #include "sym_misc.h"
138 #include "sym_conf.h"
139 #include "sym_defs.h"
140
141 /*
142  * Configuration addendum for Linux.
143  */
144 #if     LINUX_VERSION_CODE >= LinuxVersionCode(2,3,47)
145 #define SYM_LINUX_DYNAMIC_DMA_MAPPING
146 #endif
147
148 #define SYM_CONF_TIMER_INTERVAL         ((HZ+1)/2)
149
150 #define SYM_OPT_HANDLE_DIR_UNKNOWN
151 #define SYM_OPT_HANDLE_DEVICE_QUEUEING
152 #define SYM_OPT_NVRAM_PRE_READ
153 #define SYM_OPT_SNIFF_INQUIRY
154 #define SYM_OPT_LIMIT_COMMAND_REORDERING
155 #define SYM_OPT_ANNOUNCE_TRANSFER_RATE
156
157 #ifdef  SYM_LINUX_DYNAMIC_DMA_MAPPING
158 #define SYM_OPT_BUS_DMA_ABSTRACTION
159 #endif
160
161 /*
162  *  Print a message with severity.
163  */
164 #define printf_emerg(args...)   printk(KERN_EMERG args)
165 #define printf_alert(args...)   printk(KERN_ALERT args)
166 #define printf_crit(args...)    printk(KERN_CRIT args)
167 #define printf_err(args...)     printk(KERN_ERR args)
168 #define printf_warning(args...) printk(KERN_WARNING args)
169 #define printf_notice(args...)  printk(KERN_NOTICE args)
170 #define printf_info(args...)    printk(KERN_INFO args)
171 #define printf_debug(args...)   printk(KERN_DEBUG args)
172 #define printf(args...)         printk(args)
173
174 /*
175  *  Insert a delay in micro-seconds and milli-seconds.
176  */
177 void sym_udelay(int us);
178 void sym_mdelay(int ms);
179
180 /*
181  *  Let the compiler know about driver data structure names.
182  */
183 typedef struct sym_tcb *tcb_p;
184 typedef struct sym_lcb *lcb_p;
185 typedef struct sym_ccb *ccb_p;
186 typedef struct sym_hcb *hcb_p;
187 typedef struct sym_stcb *stcb_p;
188 typedef struct sym_slcb *slcb_p;
189 typedef struct sym_sccb *sccb_p;
190 typedef struct sym_shcb *shcb_p;
191
192 /*
193  *  Define a reference to the O/S dependant IO request.
194  */
195 typedef Scsi_Cmnd *cam_ccb_p;   /* Generic */
196 typedef Scsi_Cmnd *cam_scsiio_p;/* SCSI I/O */
197
198
199 /*
200  *  IO functions definition for big/little endian CPU support.
201  *  For now, PCI chips are only supported in little endian addressing mode, 
202  */
203
204 #ifdef  __BIG_ENDIAN
205
206 #define inw_l2b         inw
207 #define inl_l2b         inl
208 #define outw_b2l        outw
209 #define outl_b2l        outl
210 #define readw_l2b       readw
211 #define readl_l2b       readl
212 #define writew_b2l      writew
213 #define writel_b2l      writel
214
215 #else   /* little endian */
216
217 #if defined(__i386__)   /* i386 implements full FLAT memory/MMIO model */
218 #define inw_raw         inw
219 #define inl_raw         inl
220 #define outw_raw        outw
221 #define outl_raw        outl
222 #define readb_raw(a)    (*(volatile unsigned char *) (a))
223 #define readw_raw(a)    (*(volatile unsigned short *) (a))
224 #define readl_raw(a)    (*(volatile unsigned int *) (a))
225 #define writeb_raw(b,a) ((*(volatile unsigned char *) (a)) = (b))
226 #define writew_raw(b,a) ((*(volatile unsigned short *) (a)) = (b))
227 #define writel_raw(b,a) ((*(volatile unsigned int *) (a)) = (b))
228
229 #else   /* Other little-endian */
230 #define inw_raw         inw
231 #define inl_raw         inl
232 #define outw_raw        outw
233 #define outl_raw        outl
234 #define readw_raw       readw
235 #define readl_raw       readl
236 #define writew_raw      writew
237 #define writel_raw      writel
238
239 #endif
240 #endif
241
242 #ifdef  SYM_CONF_CHIP_BIG_ENDIAN
243 #error  "Chips in BIG ENDIAN addressing mode are not (yet) supported"
244 #endif
245
246
247 /*
248  *  If the chip uses big endian addressing mode over the 
249  *  PCI, actual io register addresses for byte and word 
250  *  accesses must be changed according to lane routing.
251  *  Btw, sym_offb() and sym_offw() macros only apply to 
252  *  constants and so donnot generate bloated code.
253  */
254
255 #if     defined(SYM_CONF_CHIP_BIG_ENDIAN)
256
257 #define sym_offb(o)     (((o)&~3)+((~((o)&3))&3))
258 #define sym_offw(o)     (((o)&~3)+((~((o)&3))&2))
259
260 #else
261
262 #define sym_offb(o)     (o)
263 #define sym_offw(o)     (o)
264
265 #endif
266
267 /*
268  *  If the CPU and the chip use same endian-ness adressing,
269  *  no byte reordering is needed for script patching.
270  *  Macro cpu_to_scr() is to be used for script patching.
271  *  Macro scr_to_cpu() is to be used for getting a DWORD 
272  *  from the script.
273  */
274
275 #if     defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
276
277 #define cpu_to_scr(dw)  cpu_to_le32(dw)
278 #define scr_to_cpu(dw)  le32_to_cpu(dw)
279
280 #elif   defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
281
282 #define cpu_to_scr(dw)  cpu_to_be32(dw)
283 #define scr_to_cpu(dw)  be32_to_cpu(dw)
284
285 #else
286
287 #define cpu_to_scr(dw)  (dw)
288 #define scr_to_cpu(dw)  (dw)
289
290 #endif
291
292 /*
293  *  Access to the controller chip.
294  *
295  *  If SYM_CONF_IOMAPPED is defined, the driver will use 
296  *  normal IOs instead of the MEMORY MAPPED IO method  
297  *  recommended by PCI specifications.
298  *  If all PCI bridges, host brigdes and architectures 
299  *  would have been correctly designed for PCI, this 
300  *  option would be useless.
301  *
302  *  If the CPU and the chip use same endian-ness adressing,
303  *  no byte reordering is needed for accessing chip io 
304  *  registers. Functions suffixed by '_raw' are assumed 
305  *  to access the chip over the PCI without doing byte 
306  *  reordering. Functions suffixed by '_l2b' are 
307  *  assumed to perform little-endian to big-endian byte 
308  *  reordering, those suffixed by '_b2l' blah, blah,
309  *  blah, ...
310  */
311
312 #if defined(SYM_CONF_IOMAPPED)
313
314 /*
315  *  IO mapped only input / ouput
316  */
317
318 #define INB_OFF(o)        inb (np->s.io_port + sym_offb(o))
319 #define OUTB_OFF(o, val)  outb ((val), np->s.io_port + sym_offb(o))
320
321 #if     defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
322
323 #define INW_OFF(o)        inw_l2b (np->s.io_port + sym_offw(o))
324 #define INL_OFF(o)        inl_l2b (np->s.io_port + (o))
325
326 #define OUTW_OFF(o, val)  outw_b2l ((val), np->s.io_port + sym_offw(o))
327 #define OUTL_OFF(o, val)  outl_b2l ((val), np->s.io_port + (o))
328
329 #elif   defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
330
331 #define INW_OFF(o)        inw_b2l (np->s.io_port + sym_offw(o))
332 #define INL_OFF(o)        inl_b2l (np->s.io_port + (o))
333
334 #define OUTW_OFF(o, val)  outw_l2b ((val), np->s.io_port + sym_offw(o))
335 #define OUTL_OFF(o, val)  outl_l2b ((val), np->s.io_port + (o))
336
337 #else
338
339 #define INW_OFF(o)        inw_raw (np->s.io_port + sym_offw(o))
340 #define INL_OFF(o)        inl_raw (np->s.io_port + (o))
341
342 #define OUTW_OFF(o, val)  outw_raw ((val), np->s.io_port + sym_offw(o))
343 #define OUTL_OFF(o, val)  outl_raw ((val), np->s.io_port + (o))
344
345 #endif  /* ENDIANs */
346
347 #else   /* defined SYM_CONF_IOMAPPED */
348
349 /*
350  *  MEMORY mapped IO input / output
351  */
352
353 #define INB_OFF(o)        readb((char *)np->s.mmio_va + sym_offb(o))
354 #define OUTB_OFF(o, val)  writeb((val), (char *)np->s.mmio_va + sym_offb(o))
355
356 #if     defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
357
358 #define INW_OFF(o)        readw_l2b((char *)np->s.mmio_va + sym_offw(o))
359 #define INL_OFF(o)        readl_l2b((char *)np->s.mmio_va + (o))
360
361 #define OUTW_OFF(o, val)  writew_b2l((val), (char *)np->s.mmio_va + sym_offw(o))
362 #define OUTL_OFF(o, val)  writel_b2l((val), (char *)np->s.mmio_va + (o))
363
364 #elif   defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
365
366 #define INW_OFF(o)        readw_b2l((char *)np->s.mmio_va + sym_offw(o))
367 #define INL_OFF(o)        readl_b2l((char *)np->s.mmio_va + (o))
368
369 #define OUTW_OFF(o, val)  writew_l2b((val), (char *)np->s.mmio_va + sym_offw(o))
370 #define OUTL_OFF(o, val)  writel_l2b((val), (char *)np->s.mmio_va + (o))
371
372 #else
373
374 #define INW_OFF(o)        readw_raw((char *)np->s.mmio_va + sym_offw(o))
375 #define INL_OFF(o)        readl_raw((char *)np->s.mmio_va + (o))
376
377 #define OUTW_OFF(o, val)  writew_raw((val), (char *)np->s.mmio_va + sym_offw(o))
378 #define OUTL_OFF(o, val)  writel_raw((val), (char *)np->s.mmio_va + (o))
379
380 #endif
381
382 #endif  /* defined SYM_CONF_IOMAPPED */
383
384 #define OUTRAM_OFF(o, a, l) memcpy_toio(np->s.ram_va + (o), (a), (l))
385
386 /*
387  *  Remap some status field values.
388  */
389 #define CAM_REQ_CMP             DID_OK
390 #define CAM_SEL_TIMEOUT         DID_NO_CONNECT
391 #define CAM_CMD_TIMEOUT         DID_TIME_OUT
392 #define CAM_REQ_ABORTED         DID_ABORT
393 #define CAM_UNCOR_PARITY        DID_PARITY
394 #define CAM_SCSI_BUS_RESET      DID_RESET       
395 #define CAM_REQUEUE_REQ         DID_SOFT_ERROR
396 #define CAM_UNEXP_BUSFREE       DID_ERROR
397 #define CAM_SCSI_BUSY           DID_BUS_BUSY
398
399 #define CAM_DEV_NOT_THERE       DID_NO_CONNECT
400 #define CAM_REQ_INVALID         DID_ERROR
401 #define CAM_REQ_TOO_BIG         DID_ERROR
402
403 #define CAM_RESRC_UNAVAIL       DID_ERROR
404
405 /*
406  *  Remap SCSI data direction values.
407  */
408 #ifndef SCSI_DATA_UNKNOWN
409 #define SCSI_DATA_UNKNOWN       0
410 #define SCSI_DATA_WRITE         1
411 #define SCSI_DATA_READ          2
412 #define SCSI_DATA_NONE          3
413 #endif
414 #define CAM_DIR_NONE            SCSI_DATA_NONE
415 #define CAM_DIR_IN              SCSI_DATA_READ
416 #define CAM_DIR_OUT             SCSI_DATA_WRITE
417 #define CAM_DIR_UNKNOWN         SCSI_DATA_UNKNOWN
418
419 /*
420  *  These ones are used as return code from 
421  *  error recovery handlers under Linux.
422  */
423 #define SCSI_SUCCESS    SUCCESS
424 #define SCSI_FAILED     FAILED
425
426 /*
427  *  System specific target data structure.
428  *  None for now, under Linux.
429  */
430 /* #define SYM_HAVE_STCB */
431
432 /*
433  *  System specific lun data structure.
434  */
435 #define SYM_HAVE_SLCB
436 struct sym_slcb {
437         u_short reqtags;        /* Number of tags requested by user */
438         u_short scdev_depth;    /* Queue depth set in select_queue_depth() */
439 };
440
441 /*
442  *  System specific command data structure.
443  *  Not needed under Linux.
444  */
445 /* struct sym_sccb */
446
447 /*
448  *  System specific host data structure.
449  */
450 struct sym_shcb {
451         /*
452          *  Chip and controller indentification.
453          */
454         int             unit;
455         char            inst_name[16];
456         char            chip_name[8];
457         struct pci_dev  *device;
458
459         u_char          bus;            /* PCI BUS number               */
460         u_char          device_fn;      /* PCI BUS device and function  */
461
462         spinlock_t      smp_lock;       /* Lock for SMP threading       */
463
464         vm_offset_t     mmio_va;        /* MMIO kernel virtual address  */
465         vm_offset_t     ram_va;         /* RAM  kernel virtual address  */
466         u32             io_port;        /* IO port address              */
467         u_short         io_ws;          /* IO window size               */
468         int             irq;            /* IRQ number                   */
469
470         SYM_QUEHEAD     wait_cmdq;      /* Awaiting SCSI commands       */
471         SYM_QUEHEAD     busy_cmdq;      /* Enqueued SCSI commands       */
472
473         struct timer_list timer;        /* Timer handler link header    */
474         u_long          lasttime;
475         u_long          settle_time;    /* Resetting the SCSI BUS       */
476         u_char          settle_time_valid;
477 #if LINUX_VERSION_CODE < LinuxVersionCode(2, 4, 0)
478         u_char          release_stage;  /* Synchronisation on release   */
479 #endif
480 };
481
482 /*
483  *  Return the name of the controller.
484  */
485 #define sym_name(np) (np)->s.inst_name
486
487 /*
488  *  Data structure used as input for the NVRAM reading.
489  *  Must resolve the IO macros and sym_name(), when  
490  *  used as sub-field 's' of another structure.
491  */
492 typedef struct {
493         int     bus;
494         u_char  device_fn;
495         u_long  base;
496         u_long  base_2;
497         u_long  base_c;
498         u_long  base_2_c;
499         int     irq;
500 /* port and address fields to fit INB, OUTB macros */
501         u_long  io_port;
502         vm_offset_t mmio_va;
503         char    inst_name[16];
504 } sym_slot;
505
506 typedef struct sym_nvram sym_nvram;
507 typedef struct sym_pci_chip sym_chip;
508
509 typedef struct {
510         struct pci_dev *pdev;
511         sym_slot  s;
512         sym_chip  chip;
513         sym_nvram *nvram;
514         u_short device_id;
515         u_char host_id;
516 #ifdef  SYM_CONF_PQS_PDS_SUPPORT
517         u_char pqs_pds;
518 #endif
519         int attach_done;
520 } sym_device;
521
522 typedef sym_device *sdev_p;
523
524 /*
525  *  The driver definitions (sym_hipd.h) must know about a 
526  *  couple of things related to the memory allocator.
527  */
528 typedef u_long m_addr_t;        /* Enough bits to represent any address */
529 #define SYM_MEM_PAGE_ORDER 0    /* 1 PAGE  maximum */
530 #define SYM_MEM_CLUSTER_SHIFT   (PAGE_SHIFT+SYM_MEM_PAGE_ORDER)
531 #ifdef  MODULE
532 #define SYM_MEM_FREE_UNUSED     /* Free unused pages immediately */
533 #endif
534 #ifdef  SYM_LINUX_DYNAMIC_DMA_MAPPING
535 typedef struct pci_dev *m_pool_ident_t;
536 #endif
537
538 /*
539  *  Include driver soft definitions.
540  */
541 #include "sym_fw.h"
542 #include "sym_hipd.h"
543
544 /*
545  *  Memory allocator related stuff.
546  */
547
548 #define SYM_MEM_GFP_FLAGS       GFP_ATOMIC
549 #define SYM_MEM_WARN    1       /* Warn on failed operations */
550
551 #define sym_get_mem_cluster()   \
552         __get_free_pages(SYM_MEM_GFP_FLAGS, SYM_MEM_PAGE_ORDER)
553 #define sym_free_mem_cluster(p) \
554         free_pages(p, SYM_MEM_PAGE_ORDER)
555
556 void *sym_calloc(int size, char *name);
557 void sym_mfree(void *m, int size, char *name);
558
559 #ifndef SYM_LINUX_DYNAMIC_DMA_MAPPING
560 /*
561  *  Simple case.
562  *  All the memory assummed DMAable and O/S providing virtual 
563  *  to bus physical address translation.
564  */
565 #define __sym_calloc_dma(pool_id, size, name)   sym_calloc(size, name)
566 #define __sym_mfree_dma(pool_id, m, size, name) sym_mfree(m, size, name)
567 #define __vtobus(b, p)                          virt_to_bus(p)
568
569 #else   /* SYM_LINUX_DYNAMIC_DMA_MAPPING */
570 /*
571  *  Complex case.
572  *  We have to provide the driver memory allocator with methods for 
573  *  it to maintain virtual to bus physical address translations.
574  */
575
576 #define sym_m_pool_match(mp_id1, mp_id2)        (mp_id1 == mp_id2)
577
578 static __inline m_addr_t sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
579 {
580         void *vaddr = 0;
581         dma_addr_t baddr = 0;
582
583         vaddr = pci_alloc_consistent(mp->dev_dmat,SYM_MEM_CLUSTER_SIZE, &baddr);
584         if (vaddr) {
585                 vbp->vaddr = (m_addr_t) vaddr;
586                 vbp->baddr = (m_addr_t) baddr;
587         }
588         return (m_addr_t) vaddr;
589 }
590
591 static __inline void sym_m_free_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
592 {
593         pci_free_consistent(mp->dev_dmat, SYM_MEM_CLUSTER_SIZE,
594                             (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
595 }
596
597 #define sym_m_create_dma_mem_tag(mp)    (0)
598
599 #define sym_m_delete_dma_mem_tag(mp)    do { ; } while (0)
600
601 void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name);
602 void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name);
603 m_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m);
604
605 #endif  /* SYM_LINUX_DYNAMIC_DMA_MAPPING */
606
607 /*
608  *  Set the status field of a CAM CCB.
609  */
610 static __inline void 
611 sym_set_cam_status(Scsi_Cmnd  *ccb, int status)
612 {
613         ccb->result &= ~(0xff  << 16);
614         ccb->result |= (status << 16);
615 }
616
617 /*
618  *  Get the status field of a CAM CCB.
619  */
620 static __inline int 
621 sym_get_cam_status(Scsi_Cmnd  *ccb)
622 {
623         return ((ccb->result >> 16) & 0xff);
624 }
625
626 /*
627  *  The dma mapping is mostly handled by the 
628  *  SCSI layer and the driver glue under Linux.
629  */
630 #define sym_data_dmamap_create(np, cp)          (0)
631 #define sym_data_dmamap_destroy(np, cp)         do { ; } while (0)
632 #define sym_data_dmamap_unload(np, cp)          do { ; } while (0)
633 #define sym_data_dmamap_presync(np, cp)         do { ; } while (0)
634 #define sym_data_dmamap_postsync(np, cp)        do { ; } while (0)
635
636 /*
637  *  Async handler for negotiations.
638  */
639 void sym_xpt_async_nego_wide(hcb_p np, int target);
640 #define sym_xpt_async_nego_sync(np, target)     \
641         sym_announce_transfer_rate(np, target)
642 #define sym_xpt_async_nego_ppr(np, target)      \
643         sym_announce_transfer_rate(np, target)
644
645 /*
646  *  Build CAM result for a successful IO and for a failed IO.
647  */
648 static __inline void sym_set_cam_result_ok(hcb_p np, ccb_p cp, int resid)
649 {
650         Scsi_Cmnd *cmd = cp->cam_ccb;
651
652 #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,99)
653         cmd->resid = resid;
654 #endif
655         cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
656 }
657 void sym_set_cam_result_error(hcb_p np, ccb_p cp, int resid);
658
659 /*
660  *  Other O/S specific methods.
661  */
662 #define sym_cam_target_id(ccb)  (ccb)->target
663 #define sym_cam_target_lun(ccb) (ccb)->lun
664 #define sym_freeze_cam_ccb(ccb) do { ; } while (0)
665 void sym_xpt_done(hcb_p np, cam_ccb_p ccb);
666 void sym_xpt_done2(hcb_p np, cam_ccb_p ccb, int cam_status);
667 void sym_print_addr (ccb_p cp);
668 void sym_xpt_async_bus_reset(hcb_p np);
669 void sym_xpt_async_sent_bdr(hcb_p np, int target);
670 int  sym_setup_data_and_start (hcb_p np, cam_scsiio_p csio, ccb_p cp);
671 void sym_log_bus_error(hcb_p np);
672 #ifdef  SYM_OPT_SNIFF_INQUIRY
673 void sym_sniff_inquiry(hcb_p np, Scsi_Cmnd *cmd, int resid);
674 #endif
675
676 #endif /* SYM_GLUE_H */