/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _SYS_MD_NAMES_H
#define _SYS_MD_NAMES_H
#ifdef __cplusplus
extern "C" {
#endif
#define NM_ALLOC_SIZE 512
#define NM_DID_ALLOC_SIZE 1024
#define NM_NOCOMMIT 0x0100
#define NM_SHARED 1
#define NM_NOTSHARED 0
#define NM_DEVID 0x0010
#define NM_IMP_SHARED 0x0020
#define NM_KEY_RECYCLE 0x0040
#define NM_DEVID_VALID 1
#define NM_DEVID_INVALID 0
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
#ifdef _KERNEL
struct nm_rec_hdr {
uint_t r_revision; /* revision number */
uint_t r_alloc_size; /* alloc'd record size */
uint_t r_used_size; /* number bytes used */
mddb_recid_t r_next_recid; /* record id of next record */
uint32_t xr_next_rec; /* ptr to record, calc at boot */
mdkey_t r_next_key; /* Next key for alloc'd entry */
};
#else /* ! _KERNEL */
struct nm_rec_hdr {
uint_t r_revision; /* revision number */
uint_t r_alloc_size; /* alloc'd record size */
uint_t r_used_size; /* number bytes used */
mddb_recid_t r_next_recid; /* record id of next record */
void *r_next_rec; /* ptr to record, calc at boot */
mdkey_t r_next_key; /* Next key for alloc'd entry */
};
#endif /* _KERNEL */
struct nm_next_hdr {
struct nm_next_hdr *nmn_nextp;
void *nmn_record;
};
struct nm_shr_rec {
struct nm_rec_hdr sr_rec_hdr; /* Record header */
struct nm_shared_name {
mdkey_t sn_key; /* Unique key for this name */
uint32_t sn_count; /* Count of users of this name */
uint32_t sn_data; /* Data ptr for users (e.g., devops */
/* sn_data NOT USED anywhere */
ushort_t sn_namlen; /* Length of string in nmsn_name */
char sn_name[1]; /* Driver/Directory name */
} sr_name[1];
};
#define SHR_NAMSIZ(n) \
(((sizeof (struct nm_shared_name) - 1) + \
(n)->sn_namlen + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1))
struct nm_rec {
struct nm_rec_hdr r_rec_hdr; /* Record header */
struct nm_name {
side_t n_side; /* (key 1) side associated with */
mdkey_t n_key; /* (key 2) allocated unique key */
uint32_t n_count; /* reference count */
minor_t n_minor; /* minor number of device */
mdkey_t n_drv_key; /* Key of driver name in nm_shared */
mdkey_t n_dir_key; /* Key of dir. name in nm_shared */
ushort_t n_namlen; /* Length of string in nme_name */
char n_name[1]; /* Filename of device is here */
} r_name[1];
};
#define NAMSIZ(n) \
(((sizeof (struct nm_name) - 1) + \
(n)->n_namlen + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1))
/*
* Device id support
*/
struct devid_shr_rec {
struct nm_rec_hdr did_rec_hdr;
struct did_shr_name {
mdkey_t did_key;
uint32_t did_count;
uint32_t did_data;
ushort_t did_size;
char did_devid[1];
} device_id[1];
};
#define DID_SHR_NAMSIZ(n) \
(((sizeof (struct did_shr_name) - 1) + \
(n)->did_size + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1))
struct devid_min_rec {
struct nm_rec_hdr min_rec_hdr;
struct did_min_name {
side_t min_side;
mdkey_t min_key;
uint32_t min_count;
mdkey_t min_devid_key;
ushort_t min_namlen;
char min_name[1];
} minor_name[1];
};
#define DID_NAMSIZ(n) \
(((sizeof (struct did_min_name) - 1) + \
(n)->min_namlen + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1))
struct nm_header {
uint_t h_revision; /* revision number */
struct nm_rec_hdr h_names; /* device-name structures */
struct nm_rec_hdr h_shared; /* shared structures */
};
struct nm_header_hdr {
struct nm_header *hh_header;
struct nm_next_hdr hh_names;
struct nm_next_hdr hh_shared;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#ifdef __cplusplus
}
#endif
#endif /* _SYS_MD_NAMES_H */