1252867Sdelphij/* $Id: ldm.h,v 1.78 2010/05/10 10:08:46 lcn Exp $ */
2252867Sdelphij/*-
3252867Sdelphij * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
4252867Sdelphij * All rights reserved.
5252867Sdelphij *
6252867Sdelphij * Redistribution and use in source and binary forms, with or without
7252867Sdelphij * modification, are permitted provided that the following conditions
8252867Sdelphij * are met:
9252867Sdelphij * 1. Redistributions of source code must retain the above copyright
10252867Sdelphij *    notice, this list of conditions and the following disclaimer.
11252867Sdelphij * 2. Redistributions in binary form must reproduce the above copyright
12252867Sdelphij *    notice, this list of conditions and the following disclaimer in the
13252867Sdelphij *    documentation and/or other materials provided with the distribution.
14252867Sdelphij *
15252867Sdelphij * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16252867Sdelphij * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17252867Sdelphij * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18252867Sdelphij * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19252867Sdelphij * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20252867Sdelphij * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21252867Sdelphij * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22252867Sdelphij * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23252867Sdelphij * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24252867Sdelphij * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25252867Sdelphij * SUCH DAMAGE.
26252867Sdelphij *
27252867Sdelphij * $FreeBSD: releng/10.3/sys/dev/hptnr/ldm.h 284935 2015-06-29 18:34:30Z delphij $
28252867Sdelphij */
29252867Sdelphij#include <dev/hptnr/hptnr_config.h>
30252867Sdelphij#ifndef _HPT_LDM_H_
31252867Sdelphij#define _HPT_LDM_H_
32252867Sdelphij
33252867Sdelphij#define VERMAGIC_LDM 75
34252867Sdelphij
35252867Sdelphij#if defined(__cplusplus)
36252867Sdelphijextern "C" {
37252867Sdelphij#endif
38252867Sdelphij
39252867Sdelphij
40252867Sdelphij#define __hpt_set_ver(x, v1, v2, v3, v4, v5) x ## _R_ ## v1 ## _ ## v2 ## _ ## v3 ## _ ## v4 ## _ ## v5
41252867Sdelphij#define _hpt_set_ver(x, v1, v2, v3, v4, v5)  __hpt_set_ver(x, v1, v2, v3, v4, v5)
42252867Sdelphij#define hpt_set_ver(x)               _hpt_set_ver(x, VERMAGIC_OSM, VERMAGIC_HIM, VERMAGIC_LDM, VERMAGIC_ARRAY, MAX_MEMBERS)
43252867Sdelphij
44252867Sdelphij#define ldm_register_him        hpt_set_ver(ldm_register_him)
45252867Sdelphij#define ldm_register_vdev_class hpt_set_ver(ldm_register_vdev_class)
46252867Sdelphij#define ldm_alloc_cmds          hpt_set_ver(ldm_alloc_cmds)
47252867Sdelphij
48252867Sdelphij
49252867Sdelphij#ifndef HPT_INTERFACE_VERSION
50252867Sdelphij#define HPT_INTERFACE_VERSION 0x02010000
51252867Sdelphij#endif
52252867Sdelphij
53252867Sdelphij#ifndef MAX_PARTITIONS_PER_DISK
54252867Sdelphij#define MAX_PARTITIONS_PER_DISK	4
55252867Sdelphij#endif
56252867Sdelphij
57252867Sdelphij#if defined(__MAX_PARTITIONS_PER_DISK) && MAX_PARTITIONS_PER_DISK > __MAX_PARTITIONS_PER_DISK
58252867Sdelphij#error "Please redefine MAX_PARTITIONS_PER_DISK!!!"
59252867Sdelphij#endif
60252867Sdelphij
61252867Sdelphij#define MAX(a,b) (((a)>(b))?(a):(b))
62252867Sdelphij#define MIN(a,b) (((a)<(b))?(a):(b))
63252867Sdelphij
64252867Sdelphij
65252867Sdelphijtypedef char check_HPT_TIME_is_unsigned[ (HPT_TIME)(-1) > 0 ? 1 : -1 ];
66252867Sdelphij
67252867Sdelphij#define hpt_time_after_eq(a, b) ((int)(a) - (int)(b) >= 0)
68252867Sdelphij#define hpt_time_after(a, b) ((int)(a) - (int)(b) > 0)
69252867Sdelphij
70252867Sdelphij
71252867Sdelphij
72252867Sdelphijstruct freelist {
73252867Sdelphij	int dma;
74252867Sdelphij	HPT_UINT alignment;
75252867Sdelphij	HPT_UINT count;
76252867Sdelphij	HPT_UINT size;
77252867Sdelphij	void * head;
78252867Sdelphij	struct freelist *next;
79252867Sdelphij#if DBG
80252867Sdelphij	char *tag;
81252867Sdelphij	HPT_UINT reserved_count;
82252867Sdelphij	#define freelist_debug_tag(list, _tag) (list)->tag = _tag
83252867Sdelphij#else
84252867Sdelphij	#define freelist_debug_tag(list, _tag)
85252867Sdelphij#endif
86252867Sdelphij};
87252867Sdelphij
88252867Sdelphij
89252867Sdelphijvoid freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count);
90252867Sdelphij
91252867Sdelphijvoid *freelist_get(struct freelist *);
92252867Sdelphijvoid freelist_put(struct freelist *, void *p);
93252867Sdelphij
94252867Sdelphijvoid freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count);
95252867Sdelphijvoid *freelist_get_dma(struct freelist *, BUS_ADDRESS *busaddr);
96252867Sdelphijvoid freelist_put_dma(struct freelist *, void *p, BUS_ADDRESS busaddr);
97252867Sdelphij
98252867Sdelphij
99252867Sdelphij#define freelist_reserve_with_tag(list, osext, size, count) \
100252867Sdelphij	do {\
101252867Sdelphij		freelist_debug_tag(list, #list  " at " __FILE__);\
102252867Sdelphij		freelist_reserve(list, osext, (HPT_UINT)(size), (HPT_UINT)(count));\
103252867Sdelphij	}while(0)
104252867Sdelphij
105252867Sdelphij#define freelist_reserve_dma_with_tag(list, osext, size, alignment, count) \
106252867Sdelphij	do {\
107252867Sdelphij		freelist_debug_tag(list, #list " at " __FILE__);\
108252867Sdelphij		freelist_reserve_dma(list, osext, (HPT_UINT)(size), (HPT_UINT)(alignment), (HPT_UINT)(count));\
109252867Sdelphij	}while(0)
110252867Sdelphij
111252867Sdelphijstruct lock_request {
112252867Sdelphij	HPT_U64 start, end;
113252867Sdelphij	struct lock_request *next;
114252867Sdelphij	struct list_head waiters; /* blocked commands */
115252867Sdelphij	struct tq_item callback;
116252867Sdelphij	int lock_cc;
117252867Sdelphij};
118252867Sdelphij
119252867Sdelphij#define INIT_LOCK_REQUEST(req, _start, _end, _cb, _arg, _cc) \
120252867Sdelphij	do {\
121252867Sdelphij		(req)->next = 0;\
122252867Sdelphij		(req)->start = _start;\
123252867Sdelphij		(req)->end = _end;\
124252867Sdelphij		INIT_TQ_ITEM(&(req)->callback, _cb, _arg);\
125252867Sdelphij		INIT_LIST_HEAD(&(req)->waiters);\
126252867Sdelphij		(req)->lock_cc = _cc;\
127252867Sdelphij	} while (0)
128252867Sdelphij
129252867Sdelphijstruct task_queue {
130252867Sdelphij	struct tq_item *head, *tail;
131252867Sdelphij};
132252867Sdelphij
133252867Sdelphij#define TQ_EMPTY(tq) ((tq)->head==0)
134252867Sdelphij
135252867Sdelphijstruct dmapool_order {
136252867Sdelphij	HPT_UINT npages;
137252867Sdelphij	struct tq_item wakeup_fn;
138252867Sdelphij	struct dmapool_order *next;
139252867Sdelphij};
140252867Sdelphij
141252867Sdelphijstruct dmapool_client {
142252867Sdelphij	void * handle;
143252867Sdelphij	HPT_UINT (*shrink)(void *handle, HPT_UINT npages);
144252867Sdelphij	int (*resume)(void *handle);
145252867Sdelphij	struct dmapool_client *next;
146252867Sdelphij};
147252867Sdelphij
148252867Sdelphijtypedef struct _VBUS * PVBUS;
149252867Sdelphijtypedef struct _VDEV * PVDEV;
150252867Sdelphij
151252867Sdelphij
152252867Sdelphijvoid dmapool_register_client(PVBUS vbus, struct dmapool_client *client);
153252867Sdelphij
154252867Sdelphij
155252867Sdelphijvoid dmapool_active(PVBUS vbus);
156252867Sdelphij
157252867Sdelphij/* return 0 if the request is immediately satisfied, non-zero otherwise. */
158252867Sdelphijint dmapool_make_order(PVBUS vbus, struct dmapool_order *order);
159252867Sdelphij
160252867Sdelphij
161252867Sdelphijvoid *dmapool_get_page(PVBUS vbus, BUS_ADDRESS *busaddr);
162252867Sdelphijvoid *dmapool_get_page_at(PVBUS vbus, void *p, BUS_ADDRESS *busaddr);
163252867Sdelphijvoid dmapool_put_page(PVBUS vbus, void *p, BUS_ADDRESS busaddr);
164252867Sdelphijvoid dmapool_init(PVBUS vbus);
165252867SdelphijHPT_UINT dmapool_max_class_pages(PVBUS vbus);
166252867Sdelphij
167252867Sdelphij
168252867Sdelphijstruct timer_call {
169252867Sdelphij	HPT_U32 interval; /*microseconds*/
170252867Sdelphij	HPT_TIME expire_time; /*microseconds*/
171252867Sdelphij	void (*proc)(void * arg);
172252867Sdelphij	void * arg;
173252867Sdelphij	struct timer_call ** pprev;
174252867Sdelphij	struct timer_call * next;
175252867Sdelphij};
176252867Sdelphij
177252867Sdelphij#define ldm_init_timer(timer) do { (timer)->next=0; (timer)->pprev=0; } while (0)
178252867Sdelphij
179252867Sdelphij#define INIT_TIMER_CALL(timer, _interval, _proc, _arg) \
180252867Sdelphij	do { \
181252867Sdelphij		HPT_ASSERT((timer)->next==0 && (timer)->pprev==0);\
182252867Sdelphij		(timer)->interval = _interval;\
183252867Sdelphij		(timer)->proc = _proc;\
184252867Sdelphij		(timer)->arg = _arg;\
185252867Sdelphij	} while(0)
186252867Sdelphij
187252867Sdelphijvoid ldm_request_timer(PVBUS vbus, struct timer_call * tc);
188252867Sdelphijvoid ldm_remove_timer(PVBUS vbus, struct timer_call * tc);
189252867Sdelphijvoid ldm_on_timer(PVBUS vbus);
190252867Sdelphij
191252867Sdelphij
192252867Sdelphijtypedef struct _LDM_ADAPTER
193252867Sdelphij{
194252867Sdelphij	struct _LDM_ADAPTER *next;
195252867Sdelphij	HIM  *him;
196252867Sdelphij	void *him_handle;
197252867Sdelphij	PVBUS vbus;
198252867Sdelphij	struct freelist freelist_dev;
199252867Sdelphij	int devid_start;
200252867Sdelphij	struct freelist freelist_plugged_dpc;
201252867Sdelphij	HPT_BOOL master;
202252867Sdelphij}
203252867SdelphijLDM_ADAPTER, *PLDM_ADAPTER;
204252867Sdelphij
205252867Sdelphijtypedef struct _IOCTL_ARG
206252867Sdelphij{
207252867Sdelphij	struct list_head link;
208252867Sdelphij	PVBUS vbus;
209252867Sdelphij	HPT_U32 dwIoControlCode;
210252867Sdelphij	HPT_U32 nInBufferSize;
211252867Sdelphij	HPT_U32 nOutBufferSize;
212252867Sdelphij	void *  lpInBuffer;
213252867Sdelphij	void *  lpOutBuffer;
214252867Sdelphij	HPT_U32 *lpBytesReturned;
215252867Sdelphij	void *  ioctl_cmnd;
216252867Sdelphij	void (* done)(struct _IOCTL_ARG *);
217252867Sdelphij	int     result; /* HPT_IOCTL_RESULT_ */
218252867Sdelphij	struct tq_item dpc;
219252867Sdelphij} IOCTL_ARG;
220252867Sdelphij
221252867Sdelphij#define HPT_IOCTL_RESULT_OK          0
222252867Sdelphij#define HPT_IOCTL_RESULT_FAILED     (-1)
223252867Sdelphij#define HPT_IOCTL_RESULT_INVALID    (-2)
224252867Sdelphij#define HPT_IOCTL_RESULT_RETRY      (-3)
225252867Sdelphij#define HPT_IOCTL_RESULT_WRONG_VBUS (-4)
226252867Sdelphij
227252867Sdelphijvoid ldm_ioctl(	PVBUS vbus,	IOCTL_ARG *IAPnt);
228252867Sdelphijvoid ldm_set_autorebuild(PVBUS vbus, int enable);
229252867SdelphijHPT_U32 ldm_get_device_id(PVDEV vd); /* for ioctl */
230252867Sdelphij
231252867Sdelphij#ifndef __HPT_RAW_LBA
232252867Sdelphij#define __HPT_RAW_LBA HPT_RAW_LBA
233252867Sdelphij#endif
234252867Sdelphij
235252867Sdelphij#include <dev/hptnr/array.h>
236252867Sdelphij
237252867Sdelphijtypedef struct hpt_raw_disk
238252867Sdelphij{
239252867Sdelphij#ifdef SUPPORT_ARRAY
240252867Sdelphij	PRAW_PARTITION raw_part_list;
241252867Sdelphij	__HPT_RAW_LBA max_available_capacity;
242252867Sdelphij	__HPT_RAW_LBA total_available_capacity;
243252867Sdelphij#endif
244252867Sdelphij	__HPT_RAW_LBA real_capacity;
245252867Sdelphij	__HPT_RAW_LBA head_position;
246281957Sdelphij	HPT_U32	logical_sector_size;
247284935Sdelphij	HPT_U8   logicalsectors_per_physicalsector;
248284935Sdelphij	HPT_U16 lowest_aligned;
249252867Sdelphij	HPT_U16 max_sectors_per_cmd;
250252867Sdelphij	HPT_U8  max_queue_depth;
251252867Sdelphij	HPT_U8  user_select_mode;
252252867Sdelphij
253252867Sdelphij	HPT_UINT  uninitialized : 1;
254252867Sdelphij	HPT_UINT  legacy_disk : 1;
255252867Sdelphij	HPT_UINT  is_spare : 1;
256252867Sdelphij	HPT_UINT  v3_format : 1;
257252867Sdelphij	HPT_UINT  need_sync : 1;
258252867Sdelphij	HPT_UINT  temp_spare : 1;
259252867Sdelphij	HPT_UINT  need_check_array : 1;
260252867Sdelphij	HPT_UINT  df_user_mode_set: 1;
261252867Sdelphij
262252867Sdelphij	HPT_UINT  df_read_ahead_set: 1;
263252867Sdelphij	HPT_UINT  enable_read_ahead : 1;
264252867Sdelphij	HPT_UINT  df_write_cache_set: 1;
265252867Sdelphij	HPT_UINT  enable_write_cache : 1;
266252867Sdelphij	HPT_UINT  df_tcq_set: 1;
267252867Sdelphij	HPT_UINT  enable_tcq : 1;
268252867Sdelphij	HPT_UINT  df_ncq_set: 1;
269252867Sdelphij	HPT_UINT  enable_ncq : 1;
270252867Sdelphij
271252867Sdelphij	HPT_UINT  bad_sector : 1;
272252867Sdelphij	HPT_UINT  df_sas : 1;
273252867Sdelphij
274252867Sdelphij	HIM  *				him;
275252867Sdelphij	int 				index;
276252867Sdelphij	PLDM_ADAPTER		adapter;
277252867Sdelphij	void *				phy_dev;
278252867Sdelphij
279252867Sdelphij	char    model[40];
280252867Sdelphij
281252867Sdelphij	struct tq_item reset_dpc;
282252867Sdelphij	int reset_pending;
283252867Sdelphij
284252867Sdelphij	struct tq_item fail_dpc;
285252867Sdelphij	int fail_pending;
286252867Sdelphij}
287252867SdelphijHPT_RAW_DISK, *PHPT_RAW_DISK;
288252867Sdelphij
289252867Sdelphijstruct vdev_class
290252867Sdelphij{
291252867Sdelphij	struct vdev_class *next;
292252867Sdelphij
293252867Sdelphij	HPT_U8   __type;
294252867Sdelphij	HPT_U8   stripped;        /* RAID0,3,5,6 */
295252867Sdelphij	HPT_U8   redundancy;      /* RAID1-1, RAID3/5-1, RAID6-2 */
296252867Sdelphij	HPT_U8   must_init;       /* RAID3,5,6 */
297252867Sdelphij	HPT_U8   docache;
298252867Sdelphij
299252867Sdelphij	HPT_UINT vbus_ext_size;
300252867Sdelphij	HPT_UINT vbus_ext_offset; /* used by LDM */
301252867Sdelphij	HPT_UINT dev_ext_size;
302252867Sdelphij	HPT_UINT cmd_ext_size;
303252867Sdelphij
304252867Sdelphij
305252867Sdelphij	void (*get_mem_info)(PVBUS vbus, void *osext, int phydev_count);
306252867Sdelphij	void (*queue_cmd)(PCOMMAND cmd);
307252867Sdelphij	void (*member_failed)(struct _VDEV * vd);
308252867Sdelphij
309252867Sdelphij
310252867Sdelphij	void (*initialize)(PVBUS vbus);
311252867Sdelphij	void (*release)(PVBUS vbus);
312252867Sdelphij	int  (*add)(PVDEV vd);
313252867Sdelphij	void (*remove)(PVDEV vd);
314252867Sdelphij	void (*reset)(PVDEV vd);
315252867Sdelphij	void (*sync_stamp)(PVDEV vd);
316252867Sdelphij	int  (*support_type)(int type);
317252867Sdelphij};
318252867Sdelphij
319252867Sdelphij
320252867Sdelphij#define VDEV_CLASS_CONSTRUCTOR(type, prefix) { \
321252867Sdelphij	0, \
322252867Sdelphij	type, \
323252867Sdelphij	prefix ## _stripped, \
324252867Sdelphij	prefix ## _redundancy, \
325252867Sdelphij	prefix ## _must_init, \
326252867Sdelphij	0, \
327252867Sdelphij	(HPT_UINT)(prefix ## _vbus_ext_size), \
328252867Sdelphij	0, \
329252867Sdelphij	(HPT_UINT)(prefix ## _dev_ext_size), \
330252867Sdelphij	(HPT_UINT)(prefix ## _cmd_ext_size), \
331252867Sdelphij	prefix ## _get_mem_info, \
332252867Sdelphij	prefix ## _queue_cmd, \
333252867Sdelphij	prefix ## _member_failed, \
334252867Sdelphij	prefix ## _initialize, \
335252867Sdelphij	prefix ## _release, \
336252867Sdelphij	prefix ## _add, \
337252867Sdelphij	prefix ## _remove, \
338252867Sdelphij	prefix ## _reset, \
339252867Sdelphij	prefix ## _sync_stamp, \
340252867Sdelphij	0 \
341252867Sdelphij}
342252867Sdelphij
343252867Sdelphij#define VD_RAW       1
344252867Sdelphij#define VD_PARTITION 4
345252867Sdelphij
346252867Sdelphij#define mIsArray(vdev_type) ((vdev_type)>VD_PARTITION)
347252867Sdelphij
348252867Sdelphij#define VD_RAID0     5
349252867Sdelphij#define VD_RAID1     6
350252867Sdelphij#define VD_JBOD      7
351252867Sdelphij#define VD_RAID5     8
352252867Sdelphij#define VD_RAID6     9
353252867Sdelphij#define VD_RAID3     10
354252867Sdelphij#define VD_RAID4     11
355252867Sdelphij#define VD_RAID1E    12
356252867Sdelphij
357252867Sdelphij#define MAX_VD_TYPE_ID  12
358252867Sdelphij
359252867Sdelphijstruct vdev_class *ldm_find_vdev_class(HPT_U8 type);
360252867Sdelphij
361252867Sdelphijtypedef struct _VDEV {
362252867Sdelphij	PVBUS vbus;
363252867Sdelphij	struct vdev_class *Class;
364252867Sdelphij	HPT_U8 type;
365252867Sdelphij	PVDEV parent;
366252867Sdelphij	void * ext;
367252867Sdelphij	HPT_U64 capacity;
368252867Sdelphij	int     target_id;
369252867Sdelphij	HPT_UINT cmds_per_request;
370252867Sdelphij
371252867Sdelphij	union {
372252867Sdelphij#ifdef SUPPORT_ARRAY
373252867Sdelphij		HPT_ARRAY array;
374252867Sdelphij		HPT_PARTITION partition;
375252867Sdelphij#endif
376252867Sdelphij		HPT_RAW_DISK raw;
377252867Sdelphij	} u;
378252867Sdelphij
379252867Sdelphij	HPT_U8 vf_online : 1;
380252867Sdelphij	HPT_U8 vf_bootmark : 1;
381252867Sdelphij	HPT_U8 vf_bootable : 1;
382252867Sdelphij	HPT_U8 vf_resetting: 1;
383252867Sdelphij	HPT_U8 vf_quiesced: 1;
384252867Sdelphij	HPT_U8 vf_clslock: 1;
385252867Sdelphij
386252867Sdelphij	HPT_U8 cache_policy; /* see CACHE_POLICY_* */
387252867Sdelphij
388252867Sdelphij	HPT_UINT cq_len;
389252867Sdelphij	HPT_UINT cmds_sent;
390252867Sdelphij
391252867Sdelphij	struct list_head link;
392252867Sdelphij	struct list_head cq_wait_send;
393252867Sdelphij	struct list_head cq_sent;
394252867Sdelphij
395252867Sdelphij	HPT_U32  last_active;
396252867Sdelphij	int cq_priority;
397252867Sdelphij	struct list_head cq_wait_lock;
398252867Sdelphij	struct lock_request *locks_granted;
399252867Sdelphij	struct lock_request *locks_wait;
400252867Sdelphij	HPT_U32 ioctl_id;
401252867Sdelphij	void * cc_ext;
402252867Sdelphij}
403252867SdelphijVDEV;
404252867Sdelphij
405252867Sdelphij#define CACHE_POLICY_NONE 0
406252867Sdelphij#define CACHE_POLICY_WRITE_THROUGH 1
407252867Sdelphij#define CACHE_POLICY_WRITE_BACK 2
408252867Sdelphij
409252867Sdelphij
410252867Sdelphijextern HIM *him_list;
411252867Sdelphij
412252867Sdelphij
413252867Sdelphijvoid ldm_register_him(PHIM him);
414252867Sdelphij
415252867Sdelphij
416252867Sdelphijvoid ldm_register_vdev_class(struct vdev_class *Class);
417252867Sdelphij
418252867Sdelphij
419252867SdelphijHPT_BOOL ldm_register_adapter(PLDM_ADAPTER adapter);
420252867Sdelphij
421252867Sdelphij
422252867Sdelphijint init_config(void);
423252867Sdelphij
424252867SdelphijHPT_UINT ldm_get_vbus_size(void);
425252867Sdelphij
426252867Sdelphij
427252867Sdelphijvoid ldm_create_vbus(PVBUS vbus, void *osext);
428252867Sdelphij
429252867Sdelphij
430252867Sdelphijvoid ldm_get_mem_info(PVBUS vbus, void *osext);
431252867Sdelphij
432252867Sdelphij
433252867Sdelphijvoid *ldm_get_vbus_ext(PVBUS vbus, struct vdev_class *Class);
434252867Sdelphij
435252867Sdelphij
436252867SdelphijPVBUS ldm_get_next_vbus(PVBUS vbus, void **posext);
437252867Sdelphij
438252867Sdelphij#define ldm_for_each_vbus(vbus, vbus_ext) \
439252867Sdelphij	for (vbus = ldm_get_next_vbus(0, (void **)(void *)&vbus_ext); vbus; \
440252867Sdelphij		vbus = ldm_get_next_vbus(vbus, (void **)(void *)&vbus_ext))
441252867Sdelphij
442252867Sdelphij
443252867Sdelphijvoid ldm_initialize_vbus_async(PVBUS vbus, PLDM_ADAPTER master_adapter, void (*done)(void *osext));
444252867Sdelphij
445252867Sdelphij/* ldm_initialize_vbus is deprecated since it will hold the CPU too long. */
446252867Sdelphij#define ldm_initialize_vbus(vbus, adapter) ldm_initialize_vbus_async(vbus, adapter, 0)
447252867Sdelphij
448252867Sdelphij
449252867Sdelphijvoid ldm_release_vbus(PVBUS vbus);
450252867Sdelphij
451252867SdelphijPVDEV ldm_create_vdev(PVBUS vbus, HPT_U8 type);
452252867Sdelphijvoid ldm_release_vdev(PVDEV vd);
453252867Sdelphij
454252867SdelphijPVDEV ldm_find_target(PVBUS vbus, int id);
455252867SdelphijPVDEV ldm_find_stamp(PVBUS vbus, HPT_U32 stamp, int seq);
456252867Sdelphij
457252867Sdelphij
458252867SdelphijPCOMMAND ldm_alloc_cmds(PVBUS vbus, HPT_UINT cnt);
459252867Sdelphijvoid ldm_free_cmds(PCOMMAND cmd);
460252867Sdelphij
461252867SdelphijHPT_UINT ldm_get_cmd_size(void);
462252867SdelphijPCOMMAND ldm_alloc_cmds_from_list(PVBUS vbus, struct freelist *list, HPT_UINT cnt);
463252867Sdelphijvoid ldm_free_cmds_to_list(struct freelist *list, PCOMMAND cmd);
464252867Sdelphij
465252867Sdelphij
466252867SdelphijPCOMMAND __ldm_alloc_cmd(struct freelist *list);
467252867Sdelphij
468252867Sdelphij#ifdef OS_SUPPORT_TASK
469252867Sdelphij#define CMD_SET_PRIORITY(cmd, pri) cmd->priority = (pri)
470252867Sdelphij#else
471252867Sdelphij#define CMD_SET_PRIORITY(cmd, pri)
472252867Sdelphij#endif
473252867Sdelphij
474252867Sdelphij
475252867Sdelphij#define CMD_GROUP_GET(grp, cmd) \
476252867Sdelphij	do {\
477252867Sdelphij		grp->grplist->count++;\
478252867Sdelphij		cmd = __ldm_alloc_cmd(grp->grplist);\
479252867Sdelphij		cmd->vbus = grp->vbus;\
480252867Sdelphij		cmd->grplist = grp->grplist;\
481252867Sdelphij		CMD_SET_PRIORITY(cmd, grp->priority);\
482252867Sdelphij	} while(0)
483252867Sdelphij
484252867Sdelphij#define CMD_GROUP_PUT(grp, cmd) \
485252867Sdelphij	do {\
486252867Sdelphij		freelist_put(grp->grplist, cmd);\
487252867Sdelphij		grp->grplist->count--;\
488252867Sdelphij	} while (0)
489252867Sdelphij
490252867Sdelphij
491252867Sdelphij
492252867Sdelphij
493252867Sdelphijvoid ldm_queue_cmd(PCOMMAND cmd);
494252867Sdelphijvoid vdev_queue_cmd(PCOMMAND cmd);
495252867Sdelphijvoid ldm_finish_cmd(PCOMMAND cmd);
496252867Sdelphij
497252867Sdelphij
498252867Sdelphijint  ldm_acquire_lock(PVDEV vd, struct lock_request *req);
499252867Sdelphijvoid ldm_release_lock(PVDEV vd, struct lock_request *req);
500252867Sdelphij
501252867Sdelphijvoid ldm_queue_task(struct task_queue *tq, struct tq_item *t);
502252867Sdelphijvoid ldm_queue_vbus_dpc(PVBUS vbus, struct tq_item *t);
503252867Sdelphij
504252867SdelphijHPT_BOOL ldm_intr(PVBUS vbus);
505252867Sdelphijvoid ldm_run(PVBUS vbus);
506252867Sdelphijint ldm_idle(PVBUS vbus);
507252867Sdelphij
508252867Sdelphij
509252867Sdelphijint ldm_reset_vbus(PVBUS vbus);
510252867Sdelphij
511252867Sdelphij
512252867Sdelphijvoid ldm_suspend(PVBUS vbus);
513252867Sdelphijvoid ldm_resume(PVBUS vbus);
514252867SdelphijLDM_ADAPTER *ldm_resume_adapter(PVBUS vbus, PLDM_ADAPTER ldm_adapter);
515252867Sdelphijvoid ldm_shutdown(PVBUS vbus);/*shutdown all the controllers*/
516252867Sdelphij
517252867Sdelphij
518252867Sdelphij#define HIM_EVENT_DEVICE_REMOVED 1
519252867Sdelphij#define HIM_EVENT_DEVICE_PLUGGED 2
520252867Sdelphij#define HIM_EVENT_DEVICE_ERROR   3
521252867Sdelphij#define HIM_EVENT_RESET_REQUIRED 4
522252867Sdelphij#define HIM_EVENT_QUIESCE_DEVICE 5
523252867Sdelphij#define HIM_EVENT_UNQUIESCE_DEVICE 6
524252867Sdelphij#define HIM_EVENT_CONFIG_CHANGED 7
525252867Sdelphij
526252867Sdelphijvoid ldm_event_notify(HPT_U32 event, void *arg1, void *arg2);
527252867Sdelphij
528252867Sdelphijvoid log_sector_repair(PVDEV vd, int success, HPT_LBA lba, HPT_U16 nsectors);
529252867Sdelphij
530252867Sdelphijvoid ldm_register_device(PVDEV vd);
531252867Sdelphijvoid ldm_unregister_device(PVDEV vd);
532252867Sdelphij
533252867SdelphijPVBUS him_handle_to_vbus(void * him_handle);
534252867Sdelphijvoid ldm_ide_fixstring (HPT_U8 *s, const int bytecount);
535252867Sdelphij#if defined(__cplusplus)
536252867Sdelphij}
537252867Sdelphij#endif
538252867Sdelphij#endif
539