Annotation of sys/dev/ic/mfivar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: mfivar.h,v 1.30 2007/03/22 16:55:31 deraadt Exp $ */
2: /*
3: * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17:
18: #include <sys/sensors.h>
19:
20: #define DEVNAME(_s) ((_s)->sc_dev.dv_xname)
21:
22: /* #define MFI_DEBUG */
23: #ifdef MFI_DEBUG
24: extern uint32_t mfi_debug;
25: #define DPRINTF(x...) do { if (mfi_debug) printf(x); } while(0)
26: #define DNPRINTF(n,x...) do { if (mfi_debug & n) printf(x); } while(0)
27: #define MFI_D_CMD 0x0001
28: #define MFI_D_INTR 0x0002
29: #define MFI_D_MISC 0x0004
30: #define MFI_D_DMA 0x0008
31: #define MFI_D_IOCTL 0x0010
32: #define MFI_D_RW 0x0020
33: #define MFI_D_MEM 0x0040
34: #define MFI_D_CCB 0x0080
35: #else
36: #define DPRINTF(x...)
37: #define DNPRINTF(n,x...)
38: #endif
39:
40: struct mfi_mem {
41: bus_dmamap_t am_map;
42: bus_dma_segment_t am_seg;
43: size_t am_size;
44: caddr_t am_kva;
45: };
46:
47: #define MFIMEM_MAP(_am) ((_am)->am_map)
48: #define MFIMEM_DVA(_am) ((_am)->am_map->dm_segs[0].ds_addr)
49: #define MFIMEM_KVA(_am) ((void *)(_am)->am_kva)
50:
51: struct mfi_prod_cons {
52: uint32_t mpc_producer;
53: uint32_t mpc_consumer;
54: uint32_t mpc_reply_q[1]; /* compensate for 1 extra reply per spec */
55: };
56:
57: struct mfi_ccb {
58: struct mfi_softc *ccb_sc;
59:
60: union mfi_frame *ccb_frame;
61: paddr_t ccb_pframe;
62: uint32_t ccb_frame_size;
63: uint32_t ccb_extra_frames;
64:
65: struct mfi_sense *ccb_sense;
66: paddr_t ccb_psense;
67:
68: bus_dmamap_t ccb_dmamap;
69:
70: union mfi_sgl *ccb_sgl;
71:
72: /* data for sgl */
73: void *ccb_data;
74: uint32_t ccb_len;
75:
76: uint32_t ccb_direction;
77: #define MFI_DATA_NONE 0
78: #define MFI_DATA_IN 1
79: #define MFI_DATA_OUT 2
80:
81: struct scsi_xfer *ccb_xs;
82:
83: void (*ccb_done)(struct mfi_ccb *);
84:
85: volatile enum {
86: MFI_CCB_FREE,
87: MFI_CCB_READY,
88: MFI_CCB_DONE
89: } ccb_state;
90: uint32_t ccb_flags;
91: #define MFI_CCB_F_ERR (1<<0)
92: TAILQ_ENTRY(mfi_ccb) ccb_link;
93: };
94:
95: TAILQ_HEAD(mfi_ccb_list, mfi_ccb);
96:
97: struct mfi_softc {
98: struct device sc_dev;
99: void *sc_ih;
100: struct scsi_link sc_link;
101:
102: u_int32_t sc_flags;
103:
104: bus_space_tag_t sc_iot;
105: bus_space_handle_t sc_ioh;
106: bus_dma_tag_t sc_dmat;
107:
108: /* mgmt lock */
109: struct rwlock sc_lock;
110:
111: /* save some useful information for logical drives that is missing
112: * in sc_ld_list
113: */
114: struct {
115: uint32_t ld_present;
116: char ld_dev[16]; /* device name sd? */
117: } sc_ld[MFI_MAX_LD];
118:
119: /* scsi ioctl from sd device */
120: int (*sc_ioctl)(struct device *, u_long, caddr_t);
121:
122: /* firmware determined max, totals and other information*/
123: uint32_t sc_max_cmds;
124: uint32_t sc_max_sgl;
125: uint32_t sc_max_ld;
126: uint32_t sc_ld_cnt;
127: /* XXX these struct should be local to mgmt function */
128: struct mfi_ctrl_info sc_info;
129: struct mfi_ld_list sc_ld_list;
130: struct mfi_ld_details sc_ld_details;
131:
132: /* all commands */
133: struct mfi_ccb *sc_ccb;
134:
135: /* producer/consumer pointers and reply queue */
136: struct mfi_mem *sc_pcq;
137:
138: /* frame memory */
139: struct mfi_mem *sc_frames;
140: uint32_t sc_frames_size;
141:
142: /* sense memory */
143: struct mfi_mem *sc_sense;
144:
145: struct mfi_ccb_list sc_ccb_freeq;
146:
147: struct ksensor *sc_sensors;
148: struct ksensordev sc_sensordev;
149: };
150:
151: int mfi_attach(struct mfi_softc *sc);
152: int mfi_intr(void *);
CVSweb