usr/src/cmd/format/auto_sense.c
author Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
Mon, 18 Jan 2010 09:26:09 +0530
changeset 11533 21be9ad3325a
parent 11350 6a6fb5fce6d1
child 11748 ef9e12e5c5c9
permissions -rw-r--r--
6848158 Format to auto-configure EMC array luns to different values
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
     5
 * Common Development and Distribution License (the "License").
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
11533
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
    22
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
 * This file contains functions to implement automatic configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
 * of scsi disks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include "global.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include "misc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include "param.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include "ctlr_scsi.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include "auto_sense.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include "partition.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include "label.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include "startup.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include "analyze.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include "io.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include "hardware_structs.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "menu_fdisk.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	DISK_NAME_MAX		256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
extern	int			nctypes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
extern	struct	ctlr_type	ctlr_types[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 * Marker for free hog partition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	HOG		(-1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 * Default partition tables
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *	Disk capacity		root	swap	usr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *	-------------		----	----	---
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *	0mb to 64mb		0	0	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *	64mb to 180mb		16mb	16mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *	180mb to 280mb		16mb	32mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *	280mb to 380mb		24mb	32mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 *	380mb to 600mb		32mb	32mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *	600mb to 1gb		32mb	64mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *	1gb to 2gb		64mb	128mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 *	2gb on up		128mb	128mb	remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
struct part_table {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	int	partitions[NDKMAP];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static struct part_table part_table_64mb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	{ 0,	0,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static struct part_table part_table_180mb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	{ 16,	16,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
static struct part_table part_table_280mb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	{ 16,	32,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
static struct part_table part_table_380mb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	{ 24,	32,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
static struct part_table part_table_600mb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	{ 32,	32,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
static struct part_table part_table_1gb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	{ 32,	64,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
static struct part_table part_table_2gb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	{ 64,	128,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
static struct part_table part_table_infinity = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	{ 128,	128,	0,	0,	0,	0,	HOG,	0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
static struct default_partitions {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   117
	diskaddr_t		min_capacity;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   118
	diskaddr_t		max_capacity;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	struct part_table	*part_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
} default_partitions[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	{ 0,	64,		&part_table_64mb },	/* 0 to 64 mb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	{ 64,	180,		&part_table_180mb },	/* 64 to 180 mb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	{ 180,	280,		&part_table_280mb },	/* 180 to 280 mb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	{ 280,	380,		&part_table_380mb },	/* 280 to 380 mb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	{ 380,	600,		&part_table_600mb },	/* 380 to 600 mb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	{ 600,	1024,		&part_table_1gb },	/* 600 to 1 gb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	{ 1024,	2048,		&part_table_2gb },	/* 1 to 2 gb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	{ 2048,	INFINITY,	&part_table_infinity },	/* 2 gb on up */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
#define	DEFAULT_PARTITION_TABLE_SIZE	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	(sizeof (default_partitions) / sizeof (struct default_partitions))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
 * msgs for check()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
#define	FORMAT_MSG	"Auto configuration via format.dat"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
#define	GENERIC_MSG	"Auto configuration via generic SCSI-2"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
 * Disks on symbios(Hardwire raid controller) return a fixed number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
 * of heads(64)/cylinders(64) and adjust the cylinders depending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 * capacity of the configured lun.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
 * In such a case we get number of physical cylinders < 3 which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
 * is the minimum required by solaris(2 reserved + 1 data cylinders).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 * Hence try to adjust the cylinders by reducing the "nsect/nhead".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 * assuming a minimum of 32 block cylinders.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
#define	MINIMUM_NO_HEADS	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
#define	MINIMUM_NO_SECTORS	16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
#define	MINIMUM_NO_CYLINDERS	128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
/* These are 16-bit fields */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
#define	MAXIMUM_NO_HEADS	65535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
#define	MAXIMUM_NO_SECTORS	65535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
#define	MAXIMUM_NO_CYLINDERS	65535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
#endif	/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
 * minimum number of cylinders required by Solaris.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
#define	SUN_MIN_CYL		3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
 * ANSI prototypes for local static functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
static struct disk_type	*generic_disk_sense(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
				int		fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
				int		can_prompt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
				struct dk_label	*label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
				struct scsi_inquiry *inquiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
				struct scsi_capacity_16 *capacity,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
				char		*disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
static int		use_existing_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
				int		fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
				int		can_prompt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
				struct dk_label	*label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
				struct scsi_inquiry *inquiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
				struct disk_type *disk_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
				struct scsi_capacity_16 *capacity);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
int			build_default_partition(struct dk_label *label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
				int ctrl_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
static struct disk_type	*find_scsi_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
				char		*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
				struct dk_label	*label);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
static struct disk_type	*find_scsi_disk_by_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
				char		*disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
static struct ctlr_type	*find_scsi_ctlr_type(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
static struct ctlr_info	*find_scsi_ctlr_info(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
				struct dk_cinfo	*dkinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
static struct disk_type	*new_scsi_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
				int		fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
				char		*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
				struct dk_label	*label);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
static struct disk_info	*find_scsi_disk_info(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
				struct dk_cinfo	*dkinfo);
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   206
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   207
static struct disk_type *new_direct_disk_type(int fd, char *disk_name,
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   208
    struct dk_label *label);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   209
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   210
static struct disk_info *find_direct_disk_info(struct dk_cinfo *dkinfo);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   211
static int efi_ioctl(int fd, int cmd, dk_efi_t *dk_ioc);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   212
static int auto_label_init(struct dk_label *label);
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   213
static struct ctlr_type *find_direct_ctlr_type(void);
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   214
static struct ctlr_info *find_direct_ctlr_info(struct dk_cinfo	*dkinfo);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   215
static  struct disk_info *find_direct_disk_info(struct dk_cinfo *dkinfo);
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   216
static struct ctlr_type *find_vbd_ctlr_type(void);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   217
static struct ctlr_info *find_vbd_ctlr_info(struct dk_cinfo *dkinfo);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   218
static struct disk_info *find_vbd_disk_info(struct dk_cinfo *dkinfo);
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   219
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
static char		*get_sun_disk_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
				char		*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
				struct scsi_inquiry *inquiry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
static char		*get_generic_disk_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
				char		*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
				struct scsi_inquiry *inquiry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
static char		*strcopy(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
				char	*dst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
				char	*src,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
				int	n);
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   230
static	int		adjust_disk_geometry(diskaddr_t capacity, uint_t *cyl,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   231
				uint_t *nsect, uint_t *nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   232
static void 		compute_chs_values(diskaddr_t total_capacity,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   233
				diskaddr_t usable_capacity, uint_t *pcylp,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   234
				uint_t *nheadp, uint_t *nsectp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
#if defined(_SUNOS_VTOC_8)
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   236
static diskaddr_t square_box(
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   237
			diskaddr_t capacity,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   238
			uint_t *dim1, uint_t lim1,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   239
			uint_t *dim2, uint_t lim2,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   240
			uint_t *dim3, uint_t lim3);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
#endif	/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
 * We need to get information necessary to construct a *new* efi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
 * label type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
auto_efi_sense(int fd, struct efi_info *label)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	struct dk_gpt	*vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	struct disk_type *disk, *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	struct disk_info *disk_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	struct ctlr_info *ctlr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	struct dk_cinfo dkinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	struct partition_info *part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	 * get vendor, product, revision and capacity info.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	if (get_disk_info(fd, label) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	 * Now build the default partition table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	if (efi_alloc_and_init(fd, EFI_NUMPAR, &vtoc) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		err_print("efi_alloc_and_init failed. \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	label->e_parts = vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
4304
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   277
	/*
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   278
	 * Create a whole hog EFI partition table:
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   279
	 * S0 takes the whole disk except the primary EFI label,
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   280
	 * backup EFI label, and the reserved partition.
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   281
	 */
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   282
	vtoc->efi_parts[0].p_tag = V_USR;
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   283
	vtoc->efi_parts[0].p_start = vtoc->efi_first_u_lba;
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   284
	vtoc->efi_parts[0].p_size = vtoc->efi_last_u_lba - vtoc->efi_first_u_lba
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   285
	    - EFI_MIN_RESV_SIZE + 1;
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   286
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   287
	/*
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   288
	 * S1-S6 are unassigned slices.
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   289
	 */
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   290
	for (i = 1; i < vtoc->efi_nparts - 2; i ++) {
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   291
		vtoc->efi_parts[i].p_tag = V_UNASSIGNED;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		vtoc->efi_parts[i].p_start = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		vtoc->efi_parts[i].p_size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
4304
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   296
	/*
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   297
	 * The reserved slice
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   298
	 */
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   299
	vtoc->efi_parts[vtoc->efi_nparts - 1].p_tag = V_RESERVED;
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   300
	vtoc->efi_parts[vtoc->efi_nparts - 1].p_start =
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   301
	    vtoc->efi_last_u_lba - EFI_MIN_RESV_SIZE + 1;
cb8b0d33b082 6466433 Default EFI slice table leaves one sector unused.
yl194034
parents: 2094
diff changeset
   302
	vtoc->efi_parts[vtoc->efi_nparts - 1].p_size = EFI_MIN_RESV_SIZE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	 * Now stick all of it into the disk_type struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	if (ioctl(fd, DKIOCINFO, &dkinfo) == -1) {
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   309
		if (option_msg && diag_msg) {
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   310
			err_print("DKIOCINFO failed\n");
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   311
		}
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   312
		return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	}
1564
a49a6e011cce 6394948 format core dump when EFI labeled disk with unavailable labels on sparc platform
lh195018
parents: 1524
diff changeset
   314
	if ((cur_ctype != NULL) && (cur_ctype->ctype_ctype == DKC_DIRECT)) {
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   315
		ctlr = find_direct_ctlr_info(&dkinfo);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   316
		disk_info = find_direct_disk_info(&dkinfo);
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   317
	} else if ((cur_ctype != NULL) && (cur_ctype->ctype_ctype == DKC_VBD)) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   318
		ctlr = find_vbd_ctlr_info(&dkinfo);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   319
		disk_info = find_vbd_disk_info(&dkinfo);
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   320
	} else {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   321
		ctlr = find_scsi_ctlr_info(&dkinfo);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   322
		disk_info = find_scsi_disk_info(&dkinfo);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   323
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	disk = (struct disk_type *)zalloc(sizeof (struct disk_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	assert(disk_info->disk_ctlr == ctlr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	dp = ctlr->ctlr_ctype->ctype_dlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	if (dp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		ctlr->ctlr_ctype->ctype_dlist = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		while (dp->dtype_next != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			dp = dp->dtype_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		dp->dtype_next = disk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	disk->dtype_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	(void) strlcpy(disk->vendor, label->vendor,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   338
	    sizeof (disk->vendor));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	(void) strlcpy(disk->product, label->product,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   340
	    sizeof (disk->product));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	(void) strlcpy(disk->revision, label->revision,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   342
	    sizeof (disk->revision));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	disk->capacity = label->capacity;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	part = (struct partition_info *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	    zalloc(sizeof (struct partition_info));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	disk->dtype_plist = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	part->pinfo_name = alloc_string("default");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	part->pinfo_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	part->etoc = vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	bzero(disk_info->v_volume, LEN_DKL_VVOL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	disk_info->disk_parts = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	return (disk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   358
static int
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   359
efi_ioctl(int fd, int cmd, dk_efi_t *dk_ioc)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   360
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   361
	void *data = dk_ioc->dki_data;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   362
	int error;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   363
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   364
	dk_ioc->dki_data_64 = (uint64_t)(uintptr_t)data;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   365
	error = ioctl(fd, cmd, (void *)dk_ioc);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   366
	dk_ioc->dki_data = data;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   367
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   368
	return (error);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   369
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   370
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   371
static struct ctlr_type *
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   372
find_direct_ctlr_type()
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   373
{
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   374
	struct	mctlr_list	*mlp;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   375
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   376
	mlp = controlp;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   377
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   378
	while (mlp != NULL) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   379
		if (mlp->ctlr_type->ctype_ctype == DKC_DIRECT) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   380
			return (mlp->ctlr_type);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   381
		}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   382
		mlp = mlp->next;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   383
	}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   384
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   385
	impossible("no DIRECT controller type");
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   386
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   387
	return ((struct ctlr_type *)NULL);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   388
}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
   389
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   390
static struct ctlr_type *
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   391
find_vbd_ctlr_type()
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   392
{
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   393
	struct	mctlr_list	*mlp;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   394
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   395
	mlp = controlp;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   396
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   397
	while (mlp != NULL) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   398
		if (mlp->ctlr_type->ctype_ctype == DKC_VBD) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   399
			return (mlp->ctlr_type);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   400
		}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   401
		mlp = mlp->next;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   402
	}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   403
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   404
	impossible("no VBD controller type");
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   405
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   406
	return ((struct ctlr_type *)NULL);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   407
}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   408
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   409
static struct ctlr_info *
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   410
find_direct_ctlr_info(
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   411
	struct dk_cinfo		*dkinfo)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   412
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   413
	struct ctlr_info	*ctlr;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   414
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   415
	if (dkinfo->dki_ctype != DKC_DIRECT)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   416
		return (NULL);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   417
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   418
	for (ctlr = ctlr_list; ctlr != NULL; ctlr = ctlr->ctlr_next) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   419
		if (ctlr->ctlr_addr == dkinfo->dki_addr &&
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   420
		    ctlr->ctlr_space == dkinfo->dki_space &&
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   421
		    ctlr->ctlr_ctype->ctype_ctype == DKC_DIRECT) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   422
			return (ctlr);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   423
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   424
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   425
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   426
	impossible("no DIRECT controller info");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   427
	/*NOTREACHED*/
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   428
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   429
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   430
static struct ctlr_info *
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   431
find_vbd_ctlr_info(
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   432
	struct dk_cinfo		*dkinfo)
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   433
{
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   434
	struct ctlr_info	*ctlr;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   435
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   436
	if (dkinfo->dki_ctype != DKC_VBD)
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   437
		return (NULL);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   438
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   439
	for (ctlr = ctlr_list; ctlr != NULL; ctlr = ctlr->ctlr_next) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   440
		if (ctlr->ctlr_addr == dkinfo->dki_addr &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   441
		    ctlr->ctlr_space == dkinfo->dki_space &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   442
		    ctlr->ctlr_ctype->ctype_ctype == DKC_VBD) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   443
			return (ctlr);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   444
		}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   445
	}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   446
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   447
	impossible("no VBD controller info");
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   448
	/*NOTREACHED*/
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   449
}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   450
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   451
static  struct disk_info *
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   452
find_direct_disk_info(
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   453
	struct dk_cinfo		*dkinfo)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   454
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   455
	struct disk_info	*disk;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   456
	struct dk_cinfo		*dp;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   457
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   458
	for (disk = disk_list; disk != NULL; disk = disk->disk_next) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   459
		assert(dkinfo->dki_ctype == DKC_DIRECT);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   460
		dp = &disk->disk_dkinfo;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   461
		if (dp->dki_ctype == dkinfo->dki_ctype &&
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   462
		    dp->dki_cnum == dkinfo->dki_cnum &&
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   463
		    dp->dki_unit == dkinfo->dki_unit &&
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   464
		    strcmp(dp->dki_dname, dkinfo->dki_dname) == 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   465
			return (disk);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   466
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   467
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   468
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   469
	impossible("No DIRECT disk info instance\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   470
	/*NOTREACHED*/
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   471
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   472
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   473
static  struct disk_info *
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   474
find_vbd_disk_info(
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   475
	struct dk_cinfo		*dkinfo)
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   476
{
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   477
	struct disk_info	*disk;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   478
	struct dk_cinfo		*dp;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   479
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   480
	for (disk = disk_list; disk != NULL; disk = disk->disk_next) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   481
		assert(dkinfo->dki_ctype == DKC_VBD);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   482
		dp = &disk->disk_dkinfo;
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   483
		if (dp->dki_ctype == dkinfo->dki_ctype &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   484
		    dp->dki_cnum == dkinfo->dki_cnum &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   485
		    dp->dki_unit == dkinfo->dki_unit &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   486
		    strcmp(dp->dki_dname, dkinfo->dki_dname) == 0) {
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   487
			return (disk);
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   488
		}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   489
	}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   490
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   491
	impossible("No VBD disk info instance\n");
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   492
	/*NOTREACHED*/
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   493
}
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
   494
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   495
/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   496
 * To convert EFI to SMI labels, we need to get label geometry.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   497
 * Unfortunately at this time there is no good way to do so.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   498
 * DKIOCGGEOM will fail if disk is EFI labeled. So we hack around
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   499
 * it and clear EFI label, do a DKIOCGGEOM and put the EFI label
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   500
 * back on disk.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   501
 * This routine gets the label geometry and initializes the label
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   502
 * It uses cur_file as opened device.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   503
 * returns 0 if succeeds or -1 if failed.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   504
 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   505
static int
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   506
auto_label_init(struct dk_label *label)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   507
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   508
	dk_efi_t	dk_ioc;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   509
	dk_efi_t	dk_ioc_back;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   510
	efi_gpt_t	*data = NULL;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   511
	efi_gpt_t	*databack = NULL;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   512
	struct dk_geom	disk_geom;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   513
	struct dk_minfo	disk_info;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   514
	efi_gpt_t 	*backsigp;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   515
	int		fd = cur_file;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   516
	int		rval = -1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   517
	int		efisize = EFI_LABEL_SIZE * 2;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   518
	int		success = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   519
	uint64_t	sig;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   520
	uint64_t	backsig;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   521
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   522
	if ((data = calloc(efisize, 1)) == NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   523
		err_print("auto_label_init: calloc failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   524
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   525
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   526
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   527
	dk_ioc.dki_data = data;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   528
	dk_ioc.dki_lba = 1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   529
	dk_ioc.dki_length = efisize;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   530
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   531
	if (efi_ioctl(fd, DKIOCGETEFI, &dk_ioc) != 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   532
		err_print("auto_label_init: GETEFI failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   533
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   534
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   535
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   536
	if ((databack = calloc(efisize, 1)) == NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   537
		err_print("auto_label_init calloc2 failed");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   538
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   539
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   540
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   541
	/* get the LBA size and capacity */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   542
	if (ioctl(fd, DKIOCGMEDIAINFO, (caddr_t)&disk_info) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   543
		err_print("auto_label_init: dkiocgmediainfo failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   544
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   545
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   546
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   547
	if (disk_info.dki_lbsize == 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   548
		if (option_msg && diag_msg) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   549
			err_print("auto_lbal_init: assuming 512 byte"
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   550
			    "block size");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   551
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   552
		disk_info.dki_lbsize = DEV_BSIZE;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   553
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   554
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   555
	dk_ioc_back.dki_data = databack;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   556
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   557
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   558
	 * back up efi label goes to capacity - 1, we are reading an extra block
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   559
	 * before the back up label.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   560
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   561
	dk_ioc_back.dki_lba = disk_info.dki_capacity - 1 - 1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   562
	dk_ioc_back.dki_length = efisize;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   563
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   564
	if (efi_ioctl(fd, DKIOCGETEFI, &dk_ioc_back) != 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   565
		err_print("auto_label_init: GETEFI backup failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   566
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   567
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   568
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   569
	sig = dk_ioc.dki_data->efi_gpt_Signature;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   570
	dk_ioc.dki_data->efi_gpt_Signature = 0x0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   571
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   572
	enter_critical();
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   573
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   574
	if (efi_ioctl(fd, DKIOCSETEFI, &dk_ioc) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   575
		err_print("auto_label_init: SETEFI failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   576
		exit_critical();
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   577
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   578
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   579
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   580
	backsigp = (efi_gpt_t *)((uintptr_t)dk_ioc_back.dki_data + cur_blksz);
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   581
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   582
	backsig = backsigp->efi_gpt_Signature;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   583
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   584
	backsigp->efi_gpt_Signature = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   585
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   586
	if (efi_ioctl(fd, DKIOCSETEFI, &dk_ioc_back) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   587
		err_print("auto_label_init: SETEFI backup failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   588
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   589
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   590
	if (ioctl(cur_file, DKIOCGGEOM, &disk_geom) != 0)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   591
		err_print("auto_label_init: GGEOM failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   592
	else
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   593
		success = 1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   594
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   595
	dk_ioc.dki_data->efi_gpt_Signature = sig;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   596
	backsigp->efi_gpt_Signature = backsig;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   597
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   598
	if (efi_ioctl(cur_file, DKIOCSETEFI, &dk_ioc_back) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   599
		err_print("auto_label_init: SETEFI revert backup failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   600
		success = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   601
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   602
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   603
	if (efi_ioctl(cur_file, DKIOCSETEFI, &dk_ioc) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   604
		err_print("auto_label_init: SETEFI revert failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   605
		success = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   606
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   607
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   608
	exit_critical();
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   609
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   610
	if (success == 0)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   611
		goto auto_label_init_out;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   612
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   613
	ncyl = disk_geom.dkg_ncyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   614
	acyl = disk_geom.dkg_acyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   615
	nhead =  disk_geom.dkg_nhead;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   616
	nsect = disk_geom.dkg_nsect;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   617
	pcyl = ncyl + acyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   618
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   619
	label->dkl_pcyl = pcyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   620
	label->dkl_ncyl = ncyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   621
	label->dkl_acyl = acyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   622
	label->dkl_nhead = nhead;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   623
	label->dkl_nsect = nsect;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   624
	label->dkl_apc = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   625
	label->dkl_intrlv = 1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   626
	label->dkl_rpm = disk_geom.dkg_rpm;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   627
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   628
	label->dkl_magic = DKL_MAGIC;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   629
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   630
	(void) snprintf(label->dkl_asciilabel, sizeof (label->dkl_asciilabel),
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   631
	    "%s cyl %u alt %u hd %u sec %u",
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   632
	    "DEFAULT", ncyl, acyl, nhead, nsect);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   633
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   634
	rval = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   635
#if defined(_FIRMWARE_NEEDS_FDISK)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   636
	(void) auto_solaris_part(label);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   637
	ncyl = label->dkl_ncyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   638
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   639
#endif	/* defined(_FIRMWARE_NEEDS_FDISK) */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   640
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   641
	if (!build_default_partition(label, DKC_DIRECT)) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   642
		rval = -1;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   643
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   644
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   645
	(void) checksum(label, CK_MAKESUM);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   646
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   647
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   648
auto_label_init_out:
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   649
	if (data)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   650
		free(data);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   651
	if (databack)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   652
		free(databack);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   653
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   654
	return (rval);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   655
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   656
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   657
static struct disk_type *
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   658
new_direct_disk_type(
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   659
	int		fd,
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   660
	char		*disk_name,
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   661
	struct dk_label	*label)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   662
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   663
	struct disk_type	*dp;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   664
	struct disk_type	*disk;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   665
	struct ctlr_info	*ctlr;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   666
	struct dk_cinfo		dkinfo;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   667
	struct partition_info	*part = NULL;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   668
	struct partition_info	*pt;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   669
	struct disk_info	*disk_info;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   670
	int			i;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   671
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   672
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   673
	 * Get the disk controller info for this disk
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   674
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   675
	if (ioctl(fd, DKIOCINFO, &dkinfo) == -1) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   676
		if (option_msg && diag_msg) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   677
			err_print("DKIOCINFO failed\n");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   678
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   679
		return (NULL);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   680
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   681
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   682
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   683
	 * Find the ctlr_info for this disk.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   684
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   685
	ctlr = find_direct_ctlr_info(&dkinfo);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   686
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   687
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   688
	 * Allocate a new disk type for the direct controller.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   689
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   690
	disk = (struct disk_type *)zalloc(sizeof (struct disk_type));
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   691
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   692
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   693
	 * Find the disk_info instance for this disk.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   694
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   695
	disk_info = find_direct_disk_info(&dkinfo);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   696
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   697
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   698
	 * The controller and the disk should match.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   699
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   700
	assert(disk_info->disk_ctlr == ctlr);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   701
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   702
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   703
	 * Link the disk into the list of disks
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   704
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   705
	dp = ctlr->ctlr_ctype->ctype_dlist;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   706
	if (dp == NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   707
		ctlr->ctlr_ctype->ctype_dlist = dp;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   708
	} else {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   709
		while (dp->dtype_next != NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   710
			dp = dp->dtype_next;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   711
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   712
		dp->dtype_next = disk;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   713
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   714
	disk->dtype_next = NULL;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   715
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   716
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   717
	 * Allocate and initialize the disk name.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   718
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   719
	disk->dtype_asciilabel = alloc_string(disk_name);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   720
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   721
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   722
	 * Initialize disk geometry info
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   723
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   724
	disk->dtype_pcyl = label->dkl_pcyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   725
	disk->dtype_ncyl = label->dkl_ncyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   726
	disk->dtype_acyl = label->dkl_acyl;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   727
	disk->dtype_nhead = label->dkl_nhead;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   728
	disk->dtype_nsect = label->dkl_nsect;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   729
	disk->dtype_rpm = label->dkl_rpm;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   730
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   731
	part = (struct partition_info *)
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   732
	    zalloc(sizeof (struct partition_info));
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   733
	pt = disk->dtype_plist;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   734
	if (pt == NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   735
		disk->dtype_plist = part;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   736
	} else {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   737
		while (pt->pinfo_next != NULL) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   738
			pt = pt->pinfo_next;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   739
		}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   740
		pt->pinfo_next = part;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   741
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   742
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   743
	part->pinfo_next = NULL;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   744
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   745
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   746
	 * Set up the partition name
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   747
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   748
	part->pinfo_name = alloc_string("default");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   749
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   750
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   751
	 * Fill in the partition info from the label
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   752
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   753
	for (i = 0; i < NDKMAP; i++) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   754
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   755
#if defined(_SUNOS_VTOC_8)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   756
		part->pinfo_map[i] = label->dkl_map[i];
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   757
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   758
#elif defined(_SUNOS_VTOC_16)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   759
		part->pinfo_map[i].dkl_cylno =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   760
		    label->dkl_vtoc.v_part[i].p_start /
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   761
		    ((blkaddr_t)(disk->dtype_nhead *
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   762
		    disk->dtype_nsect - apc));
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   763
		part->pinfo_map[i].dkl_nblk =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   764
		    label->dkl_vtoc.v_part[i].p_size;
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   765
#else
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   766
#error No VTOC format defined.
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   767
#endif				/* defined(_SUNOS_VTOC_8) */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   768
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   769
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   770
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   771
	 * Use the VTOC if valid, or install a default
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   772
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   773
	if (label->dkl_vtoc.v_version == V_VERSION) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   774
		(void) memcpy(disk_info->v_volume, label->dkl_vtoc.v_volume,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   775
		    LEN_DKL_VVOL);
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   776
		part->vtoc = label->dkl_vtoc;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   777
	} else {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   778
		(void) memset(disk_info->v_volume, 0, LEN_DKL_VVOL);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   779
		set_vtoc_defaults(part);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   780
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   781
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   782
	/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   783
	 * Link the disk to the partition map
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   784
	 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   785
	disk_info->disk_parts = part;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   787
	return (disk);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   788
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   789
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   790
/*
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   791
 * Get a disk type that has label info. This is used to convert
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   792
 * EFI label to SMI label
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   793
 */
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   794
struct disk_type *
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   795
auto_direct_get_geom_label(int fd, struct dk_label *label)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   796
{
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   797
	struct disk_type		*disk_type;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   798
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   799
	if (auto_label_init(label) != 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   800
		err_print("auto_direct_get_geom_label: failed to get label"
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   801
		    "geometry");
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   802
		return (NULL);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   803
	} else {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   804
		disk_type = new_direct_disk_type(fd, "DEFAULT", label);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   805
		return (disk_type);
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   806
	}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   807
}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
   808
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
 * Auto-sense a scsi disk configuration, ie get the information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
 * necessary to construct a label.  We have two different
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
 * ways to auto-sense a scsi disk:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
 *	- format.dat override, via inquiry name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
 *	- generic scsi, via standard mode sense and inquiry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
 * Depending on how and when we are called, and/or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
 * change geometry and reformat.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
auto_sense(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	int		fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	int		can_prompt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	struct dk_label	*label)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	struct scsi_inquiry		inquiry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	struct scsi_capacity_16		capacity;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	struct disk_type		*disk_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	char				disk_name[DISK_NAME_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
	int				force_format_dat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	int				force_generic = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	u_ioparam_t			ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	int				deflt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	 * First, if expert mode, find out if the user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	 * wants to override any of the standard methods.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	if (can_prompt && expert_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
		deflt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
		ioparam.io_charlist = confirm_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
		if (input(FIO_MSTR, FORMAT_MSG, '?', &ioparam,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   841
		    &deflt, DATA_INPUT) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
			force_format_dat = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
		} else if (input(FIO_MSTR, GENERIC_MSG, '?', &ioparam,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   844
		    &deflt, DATA_INPUT) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
			force_generic = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	 * Get the Inquiry data.  If this fails, there's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	 * no hope for this disk, so give up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	if (uscsi_inquiry(fd, (char *)&inquiry, sizeof (inquiry))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
		return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		err_print("Product id: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
		print_buf(inquiry.inq_pid, sizeof (inquiry.inq_pid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		err_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	 * Get the Read Capacity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	if (uscsi_read_capacity(fd, &capacity)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	}
2094
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   868
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   869
	/*
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   870
	 * If the reported capacity is set to zero, then the disk
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   871
	 * is not usable. If the reported capacity is set to all
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   872
	 * 0xf's, then this disk is too large.  These could only
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   873
	 * happen with a device that supports LBAs larger than 64
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   874
	 * bits which are not defined by any current T10 standards
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   875
	 * or by error responding from target.
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   876
	 */
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   877
	if ((capacity.sc_capacity == 0) ||
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   878
	    (capacity.sc_capacity == UINT_MAX64)) {
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   879
		if (option_msg && diag_msg) {
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   880
			err_print("Invalid capacity\n");
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   881
		}
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   882
		return ((struct disk_type *)NULL);
9c897038e006 6227573 autoconfigure generates a label that overshoots the Solaris partition
yl194034
parents: 1564
diff changeset
   883
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		err_print("blocks:  %llu (0x%llx)\n",
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   886
		    capacity.sc_capacity, capacity.sc_capacity);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		err_print("blksize: %u\n", capacity.sc_lbasize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	 * Extract the disk name for the format.dat override
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	(void) get_sun_disk_name(disk_name, &inquiry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		err_print("disk name:  `%s`\n", disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
11533
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
   898
	if (scsi_rdwr(DIR_READ, fd, (diskaddr_t)0, 1, (caddr_t)label,
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
   899
	    F_SILENT, NULL))
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
   900
		return ((struct disk_type *)NULL);
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
   901
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
	 * Figure out which method we use for auto sense.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	 * If a particular method fails, we fall back to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	 * the next possibility.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	if (force_generic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		return (generic_disk_sense(fd, can_prompt, label,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   910
		    &inquiry, &capacity, disk_name));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
	 * Try for an existing format.dat first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
	if ((disk_type = find_scsi_disk_by_name(disk_name)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		if (use_existing_disk_type(fd, can_prompt, label,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   918
		    &inquiry, disk_type, &capacity)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
			return (disk_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
		if (force_format_dat) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	 * Otherwise, try using generic SCSI-2 sense and inquiry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	return (generic_disk_sense(fd, can_prompt, label,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   931
	    &inquiry, &capacity, disk_name));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
static struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
generic_disk_sense(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
	int			fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
	int			can_prompt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	struct dk_label		*label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	struct scsi_inquiry	*inquiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	struct scsi_capacity_16	*capacity,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	char			*disk_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	struct disk_type		*disk;
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   947
	int				setdefault = 0;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   948
	uint_t				pcyl = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   949
	uint_t				ncyl = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   950
	uint_t				acyl = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   951
	uint_t				nhead = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   952
	uint_t				nsect = 0;
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   953
	int				rpm = 0;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   954
	diskaddr_t			nblocks = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   955
	diskaddr_t			tblocks = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		struct mode_format	page3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
		uchar_t			buf3[MAX_MODE_SENSE_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	} u_page3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		struct mode_geometry	page4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		uchar_t			buf4[MAX_MODE_SENSE_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
	} u_page4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	struct mode_format		*page3 = &u_page3.page3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
	struct mode_geometry		*page4 = &u_page4.page4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	struct scsi_ms_header		header;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	 * If the name of this disk appears to be "SUN", use it,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	 * otherwise construct a name out of the generic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
	 * Inquiry info.  If it turns out that we already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	 * have a SUN disk type of this name that differs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
	 * in geometry, we will revert to the generic name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
	 * anyway.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	if (memcmp(disk_name, "SUN", strlen("SUN")) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
		(void) get_generic_disk_name(disk_name, inquiry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	/*
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   981
	 * Get the number of blocks from Read Capacity data. Note that
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   982
	 * the logical block address range from 0 to capacity->sc_capacity.
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   983
	 * Limit the size to 2 TB (UINT32_MAX) to use with SMI labels.
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   984
	 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   985
	tblocks = (capacity->sc_capacity + 1);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   986
	if (tblocks > UINT32_MAX)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   987
		nblocks = UINT32_MAX;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   988
	else
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
   989
		nblocks = tblocks;
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   990
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   991
	/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	 * Get current Page 3 - Format Parameters page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
	if (uscsi_mode_sense(fd, DAD_MODE_FORMAT, MODE_SENSE_PC_CURRENT,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
   995
	    (caddr_t)&u_page3, MAX_MODE_SENSE_SIZE, &header)) {
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
   996
		setdefault = 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	 * Get current Page 4 - Drive Geometry page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	if (uscsi_mode_sense(fd, DAD_MODE_GEOMETRY, MODE_SENSE_PC_CURRENT,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1003
	    (caddr_t)&u_page4, MAX_MODE_SENSE_SIZE, &header)) {
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1004
		setdefault = 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1007
	if (setdefault != 1) {
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1008
		/* The inquiry of mode page 3 & page 4 are successful */
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1009
		/*
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1010
		 * Correct for byte order if necessary
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1011
		 */
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1012
		page4->rpm = BE_16(page4->rpm);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1013
		page4->step_rate = BE_16(page4->step_rate);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1014
		page3->tracks_per_zone = BE_16(page3->tracks_per_zone);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1015
		page3->alt_sect_zone = BE_16(page3->alt_sect_zone);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1016
		page3->alt_tracks_zone = BE_16(page3->alt_tracks_zone);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1017
		page3->alt_tracks_vol = BE_16(page3->alt_tracks_vol);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1018
		page3->sect_track = BE_16(page3->sect_track);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1019
		page3->data_bytes_sect = BE_16(page3->data_bytes_sect);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1020
		page3->interleave = BE_16(page3->interleave);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1021
		page3->track_skew = BE_16(page3->track_skew);
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1022
		page3->cylinder_skew = BE_16(page3->cylinder_skew);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1025
		/*
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1026
		 * Construct a new label out of the sense data,
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1027
		 * Inquiry and Capacity.
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1028
		 *
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1029
		 * If the disk capacity is > 1TB then simply compute
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1030
		 * the CHS values based on the total disk capacity and
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1031
		 * not use the values from mode-sense data.
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1032
		 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1033
		if (tblocks > INT32_MAX) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1034
			compute_chs_values(tblocks, nblocks, &pcyl, &nhead,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1035
			    &nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1036
		} else {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1037
			pcyl = (page4->cyl_ub << 16) + (page4->cyl_mb << 8) +
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1038
			    page4->cyl_lb;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1039
			nhead = page4->heads;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1040
			nsect = page3->sect_track;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1041
		}
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1042
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1043
		rpm = page4->rpm;
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1044
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1045
		/*
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1046
		 * If the number of physical cylinders reported is less
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1047
		 * the SUN_MIN_CYL(3) then try to adjust the geometry so that
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1048
		 * we have atleast SUN_MIN_CYL cylinders.
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1049
		 */
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1050
		if (pcyl < SUN_MIN_CYL) {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1051
			if (nhead == 0 || nsect == 0) {
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1052
				setdefault = 1;
5790
4c57e157a3c5 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks (fix cstyle)
qd208687
parents: 5786
diff changeset
  1053
			} else if (adjust_disk_geometry(
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1054
			    (diskaddr_t)(capacity->sc_capacity + 1),
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1055
			    &pcyl, &nhead, &nsect)) {
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1056
				setdefault = 1;
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1057
			}
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1058
		}
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1059
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1061
	/*
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1062
	 * Mode sense page 3 and page 4 are obsolete in SCSI-3. For
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1063
	 * newly developed large sector size disk, we will not rely on
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1064
	 * those two pages but compute geometry directly.
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1065
	 */
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1066
	if ((setdefault == 1) || (capacity->sc_lbasize != DEV_BSIZE)) {
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1067
		/*
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1068
		 * If the number of cylinders or the number of heads reported
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1069
		 * is zero, we think the inquiry of page 3 and page 4 failed.
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1070
		 * We will set the geometry infomation by ourselves.
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1071
		 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1072
		compute_chs_values(tblocks, nblocks, &pcyl, &nhead, &nsect);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	 * The sd driver reserves 2 cylinders the backup disk label and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
	 * the deviceid.  Set the number of data cylinders to pcyl-acyl.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	acyl = DK_ACYL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	ncyl = pcyl - acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
		err_print("Geometry:\n");
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1084
		err_print("    pcyl:    %u\n", pcyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1085
		err_print("    ncyl:    %u\n", ncyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1086
		err_print("    heads:   %u\n", nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1087
		err_print("    nsects:  %u\n", nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1088
		err_print("    acyl:    %u\n", acyl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
#if defined(_SUNOS_VTOC_16)
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1091
		err_print("    bcyl:    %u\n", bcyl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
#endif			/* defined(_SUNOS_VTOC_16) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
		err_print("    rpm:     %d\n", rpm);
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1095
		err_print("    nblocks:     %llu\n", nblocks);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	/*
5786
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1099
	 * Some drives do not support page4 or report 0 for page4->rpm,
09923a2f905d 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks
qd208687
parents: 4304
diff changeset
  1100
	 * adjust it to AVG_RPM, 3600.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
	if (rpm < MIN_RPM || rpm > MAX_RPM) {
11533
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
  1103
		if (option_msg && diag_msg)
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
  1104
			err_print("The current rpm value %d is invalid,"
21be9ad3325a 6848158 Format to auto-configure EMC array luns to different values
Abhinandan Ekande <Abhinandan.Ekande@Sun.COM>
parents: 11350
diff changeset
  1105
			    " adjusting it to %d\n", rpm, AVG_RPM);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
		rpm = AVG_RPM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	 * Some drives report 0 for nsect (page 3, byte 10 and 11) if they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	 * have variable number of sectors per track. So adjust nsect.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
	 * Also the value is defined as vendor specific, hence check if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	 * it is in a tolerable range. The values (32 and 4 below) are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
	 * chosen so that this change below does not generate a different
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	 * geometry for currently supported sun disks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1117
	if ((nsect == 0) ||
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1118
	    ((diskaddr_t)pcyl * nhead * nsect) < (nblocks - nblocks/32) ||
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1119
	    ((diskaddr_t)pcyl * nhead * nsect) > (nblocks + nblocks/4)) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1120
		if (nblocks > (pcyl * nhead)) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1121
			err_print("Mode sense page(3) reports nsect value"
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1122
			    " as %d, adjusting it to %llu\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1123
			    nsect, nblocks / (pcyl * nhead));
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1124
			nsect = nblocks / (pcyl * nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1125
		} else {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1126
			/* convert capacity to nsect * nhead * pcyl */
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1127
			err_print("\nWARNING: Disk geometry is based on "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1128
			    "capacity data.\n\n");
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1129
			compute_chs_values(tblocks, nblocks, &pcyl, &nhead,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1130
			    &nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1131
			ncyl = pcyl - acyl;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1132
			if (option_msg && diag_msg) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1133
				err_print("Geometry:(after adjustment)\n");
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1134
				err_print("    pcyl:    %u\n", pcyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1135
				err_print("    ncyl:    %u\n", ncyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1136
				err_print("    heads:   %u\n", nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1137
				err_print("    nsects:  %u\n", nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1138
				err_print("    acyl:    %u\n", acyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1139
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1140
#if defined(_SUNOS_VTOC_16)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1141
				err_print("    bcyl:    %u\n", bcyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1142
#endif
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1143
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1144
				err_print("    rpm:     %d\n", rpm);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1145
				err_print("    nblocks:     %llu\n", nblocks);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1146
			}
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1147
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	 * Some drives report their physical geometry such that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	 * it is greater than the actual capacity.  Adjust the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
	 * geometry to allow for this, so we don't run off
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	 * the end of the disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1156
	if (((diskaddr_t)pcyl * nhead * nsect) > nblocks) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1157
		uint_t	p = pcyl;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		if (option_msg && diag_msg) {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1159
			err_print("Computed capacity (%llu) exceeds actual "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1160
			    "disk capacity (%llu)\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1161
			    (diskaddr_t)pcyl * nhead * nsect, nblocks);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
		do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
			pcyl--;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1165
		} while (((diskaddr_t)pcyl * nhead * nsect) > nblocks);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
		if (can_prompt && expert_mode && !option_f) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
			 * Try to adjust nsect instead of pcyl to see if we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
			 * can optimize. For compatability reasons do this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
			 * only in expert mode (refer to bug 1144812).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
			 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1173
			uint_t	n = nsect;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
			do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
				n--;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1176
			} while (((diskaddr_t)p * nhead * n) > nblocks);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1177
			if (((diskaddr_t)p * nhead * n) >
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1178
			    ((diskaddr_t)pcyl * nhead * nsect)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
				u_ioparam_t	ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
				int		deflt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
				 * Ask the user for a choice here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
				ioparam.io_bounds.lower = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
				ioparam.io_bounds.upper = 2;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1186
				err_print("1. Capacity = %llu, with pcyl = %u "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1187
				    "nhead = %u nsect = %u\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1188
				    ((diskaddr_t)pcyl * nhead * nsect),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1189
				    pcyl, nhead, nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1190
				err_print("2. Capacity = %llu, with pcyl = %u "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1191
				    "nhead = %u nsect = %u\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1192
				    ((diskaddr_t)p * nhead * n),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1193
				    p, nhead, n);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
				if (input(FIO_INT, "Select one of the above "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
				    "choices ", ':', &ioparam,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1196
				    &deflt, DATA_INPUT) == 2) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
					pcyl = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
					nsect = n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
	 * Finally, we need to make sure we don't overflow any of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
	 * fields in our disk label.  To do this we need to `square
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
	 * the box' so to speak.  We will lose bits here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
	if ((pcyl > MAXIMUM_NO_CYLINDERS &&
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1212
	    ((nsect > MAXIMUM_NO_SECTORS) ||
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1213
	    (nhead > MAXIMUM_NO_HEADS))) ||
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1214
	    ((nsect > MAXIMUM_NO_SECTORS) &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1215
	    (nhead > MAXIMUM_NO_HEADS))) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
		err_print("This disk is too big to label. "
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1217
		    " You will lose some blocks.\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	if ((pcyl > MAXIMUM_NO_CYLINDERS) ||
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1220
	    (nsect > MAXIMUM_NO_SECTORS) ||
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1221
	    (nhead > MAXIMUM_NO_HEADS)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
		u_ioparam_t	ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
		int		order;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		char		msg[256];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1226
		order = ((pcyl > nhead)<<2) |
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1227
		    ((pcyl > nsect)<<1) |
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1228
		    (nhead > nsect);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
		switch (order) {
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1230
		case 0x7: /* pcyl > nhead > nsect */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1232
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1233
			    &pcyl, MAXIMUM_NO_CYLINDERS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1234
			    &nhead, MAXIMUM_NO_HEADS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1235
			    &nsect, MAXIMUM_NO_SECTORS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
			break;
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1237
		case 0x6: /* pcyl > nsect > nhead */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1239
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1240
			    &pcyl, MAXIMUM_NO_CYLINDERS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1241
			    &nsect, MAXIMUM_NO_SECTORS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1242
			    &nhead, MAXIMUM_NO_HEADS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
			break;
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1244
		case 0x4: /* nsect > pcyl > nhead */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1246
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1247
			    &nsect, MAXIMUM_NO_SECTORS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1248
			    &pcyl, MAXIMUM_NO_CYLINDERS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1249
			    &nhead, MAXIMUM_NO_HEADS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
			break;
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1251
		case 0x0: /* nsect > nhead > pcyl */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1253
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1254
			    &nsect, MAXIMUM_NO_SECTORS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1255
			    &nhead, MAXIMUM_NO_HEADS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1256
			    &pcyl, MAXIMUM_NO_CYLINDERS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
			break;
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1258
		case 0x3: /* nhead > pcyl > nsect */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1260
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1261
			    &nhead, MAXIMUM_NO_HEADS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1262
			    &pcyl, MAXIMUM_NO_CYLINDERS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1263
			    &nsect, MAXIMUM_NO_SECTORS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
			break;
6382
f75cdad912b8 6677805 format: core dump due to assertion failed: *dim2 >= *dim3, file auto_sense.c, line 1744
bz211116
parents: 5790
diff changeset
  1265
		case 0x1: /* nhead > nsect > pcyl */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1267
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1268
			    &nhead, MAXIMUM_NO_HEADS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1269
			    &nsect, MAXIMUM_NO_SECTORS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1270
			    &pcyl, MAXIMUM_NO_CYLINDERS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
			/* How did we get here? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
			impossible("label overflow adjustment");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
			/* Do something useful */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
			nblocks =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1278
			    square_box(nblocks,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1279
			    &nhead, MAXIMUM_NO_HEADS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1280
			    &nsect, MAXIMUM_NO_SECTORS,
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1281
			    &pcyl, MAXIMUM_NO_CYLINDERS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
		if (option_msg && diag_msg &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
		    (capacity->sc_capacity + 1 != nblocks)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
			err_print("After adjusting geometry you lost"
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1287
			    " %llu of %llu blocks.\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1288
			    (capacity->sc_capacity + 1 - nblocks),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1289
			    capacity->sc_capacity + 1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
		while (can_prompt && expert_mode && !option_f) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
			int				deflt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
			 * Allow user to modify this by hand if desired.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
			(void) sprintf(msg,
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1298
			    "\nGeometry: %u heads, %u sectors %u cylinders"
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1299
			    " result in %llu out of %llu blocks.\n"
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1300
			    "Do you want to modify the device geometry",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1301
			    nhead, nsect, pcyl,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1302
			    nblocks, capacity->sc_capacity + 1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
			ioparam.io_charlist = confirm_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
			if (input(FIO_MSTR, msg, '?', &ioparam,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1306
			    &deflt, DATA_INPUT) != 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
			ioparam.io_bounds.lower = MINIMUM_NO_HEADS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
			ioparam.io_bounds.upper = MAXIMUM_NO_HEADS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
			nhead = input(FIO_INT, "Number of heads", ':',
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1312
			    &ioparam, (int *)&nhead, DATA_INPUT);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
			ioparam.io_bounds.lower = MINIMUM_NO_SECTORS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
			ioparam.io_bounds.upper = MAXIMUM_NO_SECTORS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
			nsect = input(FIO_INT,
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1316
			    "Number of sectors per track",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1317
			    ':', &ioparam, (int *)&nsect, DATA_INPUT);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
			ioparam.io_bounds.lower = SUN_MIN_CYL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
			ioparam.io_bounds.upper = MAXIMUM_NO_CYLINDERS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
			pcyl = input(FIO_INT, "Number of cylinders",
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1321
			    ':', &ioparam, (int *)&pcyl, DATA_INPUT);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1322
			nblocks = (diskaddr_t)nhead * nsect * pcyl;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
			if (nblocks > capacity->sc_capacity + 1) {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1324
				err_print("Warning: %llu blocks exceeds "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1325
				    "disk capacity of %llu blocks\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1326
				    nblocks,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1327
				    capacity->sc_capacity + 1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
#endif		/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	ncyl = pcyl - acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
		err_print("\nGeometry after adjusting for capacity:\n");
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1337
		err_print("    pcyl:    %u\n", pcyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1338
		err_print("    ncyl:    %u\n", ncyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1339
		err_print("    heads:   %u\n", nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1340
		err_print("    nsects:  %u\n", nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1341
		err_print("    acyl:    %u\n", acyl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		err_print("    rpm:     %d\n", rpm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	(void) memset((char *)label, 0, sizeof (struct dk_label));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	label->dkl_magic = DKL_MAGIC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	(void) snprintf(label->dkl_asciilabel, sizeof (label->dkl_asciilabel),
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1350
	    "%s cyl %u alt %u hd %u sec %u",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1351
	    disk_name, ncyl, acyl, nhead, nsect);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	label->dkl_pcyl = pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	label->dkl_ncyl = ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	label->dkl_acyl = acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	label->dkl_nhead = nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	label->dkl_nsect = nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	label->dkl_apc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	label->dkl_intrlv = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	label->dkl_rpm = rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
#if defined(_FIRMWARE_NEEDS_FDISK)
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1363
	if (auto_solaris_part(label) == -1)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1364
		goto err;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	ncyl = label->dkl_ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
#endif		/* defined(_FIRMWARE_NEEDS_FDISK) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	if (!build_default_partition(label, DKC_SCSI_CCS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
		goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	(void) checksum(label, CK_MAKESUM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	 * Find an existing disk type defined for this disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	 * For this to work, both the name and geometry must
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	 * match.  If there is no such type, but there already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	 * is a disk defined with that name, but with a different
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	 * geometry, construct a new generic disk name out of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	 * the inquiry information.  Whatever name we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	 * finally using, if there's no such disk type defined,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	 * build a new disk definition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	if ((disk = find_scsi_disk_type(disk_name, label)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
		if (find_scsi_disk_by_name(disk_name) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
			char	old_name[DISK_NAME_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
			(void) strcpy(old_name, disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
			(void) get_generic_disk_name(disk_name,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1390
			    inquiry);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
			if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
				err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
"Changing disk type name from '%s' to '%s'\n", old_name, disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
			(void) snprintf(label->dkl_asciilabel,
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1396
			    sizeof (label->dkl_asciilabel),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1397
			    "%s cyl %u alt %u hd %u sec %u",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1398
			    disk_name, ncyl, acyl, nhead, nsect);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
			(void) checksum(label, CK_MAKESUM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
			disk = find_scsi_disk_type(disk_name, label);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
		if (disk == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
			disk = new_scsi_disk_type(fd, disk_name, label);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
			if (disk == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
				goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	return (disk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
err:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		"Configuration via generic SCSI-2 information failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
use_existing_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	int			fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	int			can_prompt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	struct dk_label		*label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	struct scsi_inquiry	*inquiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	struct disk_type	*disk_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	struct scsi_capacity_16	*capacity)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	int			pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	int			acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	int			nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
	int			nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	int			rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	 * Construct a new label out of the format.dat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
	pcyl = disk_type->dtype_pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	acyl = disk_type->dtype_acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	ncyl = disk_type->dtype_ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
	nhead = disk_type->dtype_nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
	nsect = disk_type->dtype_nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
	rpm = disk_type->dtype_rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		err_print("Format.dat geometry:\n");
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1448
		err_print("    pcyl:    %u\n", pcyl);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1449
		err_print("    heads:   %u\n", nhead);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1450
		err_print("    nsects:  %u\n", nsect);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1451
		err_print("    acyl:    %u\n", acyl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
		err_print("    rpm:     %d\n", rpm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	(void) memset((char *)label, 0, sizeof (struct dk_label));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	label->dkl_magic = DKL_MAGIC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
	(void) snprintf(label->dkl_asciilabel, sizeof (label->dkl_asciilabel),
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1460
	    "%s cyl %u alt %u hd %u sec %u",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1461
	    disk_type->dtype_asciilabel,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1462
	    ncyl, acyl, nhead, nsect);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	label->dkl_pcyl = pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	label->dkl_ncyl = ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	label->dkl_acyl = acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
	label->dkl_nhead = nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
	label->dkl_nsect = nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	label->dkl_apc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	label->dkl_intrlv = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	label->dkl_rpm = rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	if (!build_default_partition(label, DKC_SCSI_CCS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
		goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
	(void) checksum(label, CK_MAKESUM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
err:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
		err_print(
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1483
		    "Configuration via format.dat geometry failed\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
build_default_partition(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	struct dk_label			*label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	int				ctrl_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	int				i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	int				ncyls[NDKMAP];
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1495
	diskaddr_t			nblks;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
	int				cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
	struct dk_vtoc			*vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	struct part_table		*pt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
	struct default_partitions	*dpt;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1500
	diskaddr_t			capacity;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
	int				freecyls;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	int				blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
	int				ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
#ifdef lint
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
	ctrl_type = ctrl_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	 * Install a default vtoc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	vtoc = &label->dkl_vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	vtoc->v_version = V_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
	vtoc->v_nparts = NDKMAP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	vtoc->v_sanity = VTOC_SANE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
		vtoc->v_part[i].p_tag = default_vtoc_map[i].p_tag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
		vtoc->v_part[i].p_flag = default_vtoc_map[i].p_flag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	 * Find a partition that matches this disk.  Capacity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
	 * is in integral number of megabytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
	 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1526
	capacity = ((diskaddr_t)(label->dkl_ncyl) * label->dkl_nhead *
11350
6a6fb5fce6d1 6907479 SATA Flash Modules do not work on Serpa/Jumilla
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9889
diff changeset
  1527
	    label->dkl_nsect) / (diskaddr_t)((1024 * 1024) / cur_blksz);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	dpt = default_partitions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
	for (i = 0; i < DEFAULT_PARTITION_TABLE_SIZE; i++, dpt++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
		if (capacity >= dpt->min_capacity &&
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1531
		    capacity < dpt->max_capacity) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	if (i == DEFAULT_PARTITION_TABLE_SIZE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
		if (option_msg && diag_msg) {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1537
			err_print("No matching default partition (%llu)\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1538
			    capacity);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
	pt = dpt->part_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
	 * Go through default partition table, finding fixed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
	 * sized entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
	freecyls = label->dkl_ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
	blks_per_cyl = label->dkl_nhead * label->dkl_nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		if (pt->partitions[i] == HOG || pt->partitions[i] == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
			ncyls[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
			 * Calculate number of cylinders necessary
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
			 * for specified size, rounding up to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
			 * the next greatest integral number of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
			 * cylinders.  Always give what they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
			 * asked or more, never less.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
			 */
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1561
			nblks = pt->partitions[i] * ((1024*1024)/cur_blksz);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
			nblks += (blks_per_cyl - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
			ncyls[i] = nblks / blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
			freecyls -= ncyls[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
	if (freecyls < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
		if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
			for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
				if (ncyls[i] == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
					continue;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1573
				err_print("Partition %d: %u cyls\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1574
				    i, ncyls[i]);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
			err_print("Free cylinders exhausted (%d)\n",
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1577
			    freecyls);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
#if defined(i386)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
	 * Set the default boot partition to 1 cylinder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
	ncyls[8] = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
	freecyls -= 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
	 * If current disk type is not a SCSI disk,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
	 * set the default alternates partition to 2 cylinders
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
	if (ctrl_type != DKC_SCSI_CCS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
		ncyls[9] = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
		freecyls -= 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
#endif			/* defined(i386) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	 * Set the free hog partition to whatever space remains.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
	 * It's an error to have more than one HOG partition,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	 * but we don't verify that here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
		if (pt->partitions[i] == HOG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
			assert(ncyls[i] == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
			ncyls[i] = freecyls;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
	 * Error checking
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
	ncyl = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
		ncyl += ncyls[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
	assert(ncyl == (label->dkl_ncyl));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
	 * Finally, install the partition in the label.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
	cyl = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
#if defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
	for (i = NDKMAP/2; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
		if (i == 2 || ncyls[i] == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
		label->dkl_vtoc.v_part[i].p_start = cyl * blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
		label->dkl_vtoc.v_part[i].p_size = ncyls[i] * blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
		cyl += ncyls[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
	for (i = 0; i < NDKMAP/2; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
#elif defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
#endif				/* defined(_SUNOS_VTOC_16) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1642
		if (i == 2 || ncyls[i] == 0) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1643
#if defined(_SUNOS_VTOC_8)
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1644
			if (i != 2) {
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1645
				label->dkl_map[i].dkl_cylno = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1646
				label->dkl_map[i].dkl_nblk = 0;
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1647
			}
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1648
#endif
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
			continue;
786
5c0d97122ae6 4855218 sparc: Need EFI label support on IDE
lclee
parents: 362
diff changeset
  1650
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
		label->dkl_map[i].dkl_cylno = cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
		label->dkl_map[i].dkl_nblk = ncyls[i] * blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
#elif defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
		label->dkl_vtoc.v_part[i].p_start = cyl * blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
		label->dkl_vtoc.v_part[i].p_size = ncyls[i] * blks_per_cyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
		cyl += ncyls[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
	 * Set the whole disk partition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
	label->dkl_map[2].dkl_cylno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
	label->dkl_map[2].dkl_nblk =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1671
	    label->dkl_ncyl * label->dkl_nhead * label->dkl_nsect;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
#elif defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	label->dkl_vtoc.v_part[2].p_start = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
	label->dkl_vtoc.v_part[2].p_size =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1676
	    (label->dkl_ncyl + label->dkl_acyl) * label->dkl_nhead *
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1677
	    label->dkl_nsect;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
	if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
		float	scaled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
		err_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
		for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
			if (label->dkl_map[i].dkl_nblk == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
#elif defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
			if (label->dkl_vtoc.v_part[i].p_size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
			err_print("Partition %d:   ", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
			scaled = bn2mb(label->dkl_map[i].dkl_nblk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
#elif defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
			scaled = bn2mb(label->dkl_vtoc.v_part[i].p_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
			if (scaled > 1024.0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
				err_print("%6.2fGB  ", scaled/1024.0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
				err_print("%6.2fMB  ", scaled);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
			}
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1714
#if defined(_SUNOS_VTOC_8)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
			err_print(" %6d cylinders\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
			    label->dkl_map[i].dkl_nblk/blks_per_cyl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
#elif defined(_SUNOS_VTOC_16)
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1718
			err_print(" %6d cylinders\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
			    label->dkl_vtoc.v_part[i].p_size/blks_per_cyl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		err_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
 * Find an existing scsi disk definition by this name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
 * if possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
static struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
find_scsi_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	char			*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	struct dk_label		*label)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
	struct ctlr_type	*ctlr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
	struct disk_type	*dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
	ctlr = find_scsi_ctlr_type();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
	for (dp = ctlr->ctype_dlist; dp != NULL; dp = dp->dtype_next) {
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1747
		if (dp->dtype_asciilabel) {
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1748
			if ((strcmp(dp->dtype_asciilabel, disk_name) == 0) &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1749
			    dp->dtype_pcyl == label->dkl_pcyl &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1750
			    dp->dtype_ncyl == label->dkl_ncyl &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1751
			    dp->dtype_acyl == label->dkl_acyl &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1752
			    dp->dtype_nhead == label->dkl_nhead &&
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1753
			    dp->dtype_nsect == label->dkl_nsect) {
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1754
				return (dp);
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1755
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
	return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
 * Find an existing scsi disk definition by this name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
 * if possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
static struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
find_scsi_disk_by_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	char			*disk_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	struct ctlr_type	*ctlr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	struct disk_type	*dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
	ctlr = find_scsi_ctlr_type();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	for (dp = ctlr->ctype_dlist; dp != NULL; dp = dp->dtype_next) {
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1776
		if (dp->dtype_asciilabel) {
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1777
			if ((strcmp(dp->dtype_asciilabel, disk_name) == 0)) {
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1778
				return (dp);
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1779
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	return ((struct disk_type *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
 * Return a pointer to the ctlr_type structure for SCSI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
 * disks.  This list is built into the program, so there's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
 * no chance of not being able to find it, unless someone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
 * totally mangles the code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
static struct ctlr_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
find_scsi_ctlr_type()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	struct	mctlr_list	*mlp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	mlp = controlp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
	while (mlp != NULL) {
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  1801
		if (mlp->ctlr_type->ctype_ctype == DKC_SCSI_CCS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
			return (mlp->ctlr_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
		}
7912
2c087d184a3a 6688597 label EFI to virtual disk failed on pv domU
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 7563
diff changeset
  1804
		mlp = mlp->next;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
	impossible("no SCSI controller type");
362
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  1808
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  1809
	return ((struct ctlr_type *)NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
 * Return a pointer to the scsi ctlr_info structure.  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
 * structure is allocated the first time format sees a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
 * disk on this controller, so it must be present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
static struct ctlr_info *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
find_scsi_ctlr_info(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
	struct dk_cinfo		*dkinfo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
	struct ctlr_info	*ctlr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  1825
	if (dkinfo->dki_ctype != DKC_SCSI_CCS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	for (ctlr = ctlr_list; ctlr != NULL; ctlr = ctlr->ctlr_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
		if (ctlr->ctlr_addr == dkinfo->dki_addr &&
7912
2c087d184a3a 6688597 label EFI to virtual disk failed on pv domU
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 7563
diff changeset
  1831
		    ctlr->ctlr_space == dkinfo->dki_space &&
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  1832
		    ctlr->ctlr_ctype->ctype_ctype == DKC_SCSI_CCS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
			return (ctlr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
	impossible("no SCSI controller info");
362
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  1838
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  1839
	return ((struct ctlr_info *)NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
static struct disk_type *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
new_scsi_disk_type(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
	int		fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
	char		*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	struct dk_label	*label)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
	struct disk_type	*dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
	struct disk_type	*disk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
	struct ctlr_info	*ctlr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	struct dk_cinfo		dkinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
	struct partition_info	*part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
	struct partition_info	*pt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	struct disk_info	*disk_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	 * Get the disk controller info for this disk
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	if (ioctl(fd, DKIOCINFO, &dkinfo) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
		if (option_msg && diag_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
			err_print("DKIOCINFO failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
	 * Find the ctlr_info for this disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	ctlr = find_scsi_ctlr_info(&dkinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
	 * Allocate a new disk type for the SCSI controller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
	disk = (struct disk_type *)zalloc(sizeof (struct disk_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	 * Find the disk_info instance for this disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
	disk_info = find_scsi_disk_info(&dkinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
	 * The controller and the disk should match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
	assert(disk_info->disk_ctlr == ctlr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
	 * Link the disk into the list of disks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
	dp = ctlr->ctlr_ctype->ctype_dlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
	if (dp == NULL) {
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  1894
		ctlr->ctlr_ctype->ctype_dlist = disk;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
		while (dp->dtype_next != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
			dp = dp->dtype_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
		dp->dtype_next = disk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	disk->dtype_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
	 * Allocate and initialize the disk name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	disk->dtype_asciilabel = alloc_string(disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	 * Initialize disk geometry info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	disk->dtype_pcyl = label->dkl_pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	disk->dtype_ncyl = label->dkl_ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	disk->dtype_acyl = label->dkl_acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	disk->dtype_nhead = label->dkl_nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	disk->dtype_nsect = label->dkl_nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
	disk->dtype_rpm = label->dkl_rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	 * Attempt to match the partition map in the label
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
	 * with a know partition for this disk type.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
	for (part = disk->dtype_plist; part; part = part->pinfo_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
		if (parts_match(label, part)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	 * If no match was made, we need to create a partition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
	 * map for this disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
	if (part == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
		part = (struct partition_info *)
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1934
		    zalloc(sizeof (struct partition_info));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
		pt = disk->dtype_plist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
		if (pt == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
			disk->dtype_plist = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
			while (pt->pinfo_next != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
				pt = pt->pinfo_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
			pt->pinfo_next = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
		part->pinfo_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
		 * Set up the partition name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
		part->pinfo_name = alloc_string("default");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
		 * Fill in the partition info from the label
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
		for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
			part->pinfo_map[i] = label->dkl_map[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
#elif defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
			part->pinfo_map[i].dkl_cylno =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1961
			    label->dkl_vtoc.v_part[i].p_start /
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1962
			    ((blkaddr32_t)(disk->dtype_nhead *
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1963
			    disk->dtype_nsect - apc));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
			part->pinfo_map[i].dkl_nblk =
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1965
			    label->dkl_vtoc.v_part[i].p_size;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
#error No VTOC format defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
#endif				/* defined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
	 * Use the VTOC if valid, or install a default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
	if (label->dkl_vtoc.v_version == V_VERSION) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
		(void) memcpy(disk_info->v_volume, label->dkl_vtoc.v_volume,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  1979
		    LEN_DKL_VVOL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		part->vtoc = label->dkl_vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		(void) memset(disk_info->v_volume, 0, LEN_DKL_VVOL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
		set_vtoc_defaults(part);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	 * Link the disk to the partition map
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
	disk_info->disk_parts = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
	return (disk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  1995
/*
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  1996
 * Delete a disk type from disk type list.
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  1997
 */
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  1998
int
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  1999
delete_disk_type(
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2000
		struct disk_type *disk_type)
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2001
{
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2002
	struct ctlr_type	*ctlr;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2003
	struct disk_type	*dp, *disk;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2004
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2005
	if (cur_ctype->ctype_ctype == DKC_DIRECT)
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2006
		ctlr = find_direct_ctlr_type();
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2007
	else if (cur_ctype->ctype_ctype == DKC_VBD)
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2008
		ctlr = find_vbd_ctlr_type();
1524
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2009
	else
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2010
		ctlr = find_scsi_ctlr_type();
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2011
	if (ctlr == NULL || ctlr->ctype_dlist == NULL) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2012
		return (-1);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2013
	}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2014
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2015
	disk = ctlr->ctype_dlist;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2016
	if (disk == disk_type) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2017
		ctlr->ctype_dlist = disk->dtype_next;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2018
		if (cur_label == L_TYPE_EFI)
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2019
			free(disk->dtype_plist->etoc);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2020
		free(disk->dtype_plist);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2021
		free(disk);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2022
		return (0);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2023
	} else {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2024
		for (dp = disk->dtype_next; dp != NULL;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2025
		    disk = disk->dtype_next, dp = dp->dtype_next) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2026
			if (dp == disk_type) {
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2027
				disk->dtype_next = dp->dtype_next;
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2028
				if (cur_label == L_TYPE_EFI)
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2029
					free(dp->dtype_plist->etoc);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2030
				free(dp->dtype_plist);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2031
				free(dp);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2032
				return (0);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2033
			}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2034
		}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2035
		return (-1);
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2036
	}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2037
}
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2038
11351a0daccf 6375238 format core dump when try to modify the disk label
lh195018
parents: 786
diff changeset
  2039
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
static struct disk_info *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
find_scsi_disk_info(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	struct dk_cinfo		*dkinfo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
	struct disk_info	*disk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
	struct dk_cinfo		*dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
	for (disk = disk_list; disk != NULL; disk = disk->disk_next) {
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2048
		assert(dkinfo->dki_ctype == DKC_SCSI_CCS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
		dp = &disk->disk_dkinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
		if (dp->dki_ctype == dkinfo->dki_ctype &&
9547
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2051
		    dp->dki_cnum == dkinfo->dki_cnum &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2052
		    dp->dki_unit == dkinfo->dki_unit &&
79083b0f7125 6836939 Adding checks for DKC_VBD type in auto_sense.c
bo zhou - Sun Microsystems - Beijing China <Bo.Zhou@Sun.COM>
parents: 9522
diff changeset
  2053
		    strcmp(dp->dki_dname, dkinfo->dki_dname) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
			return (disk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
	impossible("No SCSI disk info instance\n");
362
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  2059
59b8c6392dc9 6268939 cmd/addbadsec and gcc don't get along
bg159949
parents: 0
diff changeset
  2060
	return ((struct disk_info *)NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
get_sun_disk_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
	char			*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
	struct scsi_inquiry	*inquiry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
	 * Extract the sun name of the disk
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
	(void) memset(disk_name, 0, DISK_NAME_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
	(void) memcpy(disk_name, (char *)&inquiry->inq_pid[9], 7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	return (disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
get_generic_disk_name(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
	char			*disk_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
	struct scsi_inquiry	*inquiry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
	char	*p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
	(void) memset(disk_name, 0, DISK_NAME_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
	p = strcopy(disk_name, inquiry->inq_vid,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  2088
	    sizeof (inquiry->inq_vid));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
	*p++ = '-';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
	p = strcopy(p, inquiry->inq_pid, sizeof (inquiry->inq_pid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
	*p++ = '-';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
	p = strcopy(p, inquiry->inq_revision,
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  2093
	    sizeof (inquiry->inq_revision));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	return (disk_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
 * Copy a string of characters from src to dst, for at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
 * most n bytes.  Strip all leading and trailing spaces,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
 * and stop if there are any non-printable characters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
 * Return ptr to the next character to be filled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
strcopy(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
	char	*dst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
	char	*src,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
	int	n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
	int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
	while (*src == ' ' && n > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
		src++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
		n--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
	for (i = 0; n-- > 0 && isascii(*src) && isprint(*src); src++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
		if (*src == ' ') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
			i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
			while (i-- > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
				*dst++ = ' ';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
			*dst++ = *src;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
	*dst = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
	return (dst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
 * adjust disk geometry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
 * This is used when disk reports a disk geometry page having
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
 * no of physical cylinders is < 3 which is the minimum required
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
 * by Solaris (2 for storing labels and at least one as a data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
 * cylinder )
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
int
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2139
adjust_disk_geometry(diskaddr_t capacity, uint_t *cyl, uint_t *nhead,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2140
	uint_t *nsect)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
{
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2142
	uint_t	lcyl = *cyl;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2143
	uint_t	lnhead = *nhead;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2144
	uint_t	lnsect = *nsect;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
	assert(lcyl < SUN_MIN_CYL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
	 * reduce nsect by 2 for each iteration  and re-calculate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
	 * the number of cylinders.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
	while (lnsect > MINIMUM_NO_SECTORS &&
5790
4c57e157a3c5 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks (fix cstyle)
qd208687
parents: 5786
diff changeset
  2153
	    lcyl < MINIMUM_NO_CYLINDERS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
		 * make sure that we do not go below MINIMUM_NO_SECTORS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
		lnsect = max(MINIMUM_NO_SECTORS, lnsect / 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
		lcyl   = (capacity) / (lnhead * lnsect);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
	 * If the geometry still does not satisfy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
	 * MINIMUM_NO_CYLINDERS then try to reduce the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
	 * no of heads.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	while (lnhead > MINIMUM_NO_HEADS &&
5790
4c57e157a3c5 6595726 Unable to auto-configure a label for Hitachi 2.5" SAS 10K 146/72GB (Dual Port) disks (fix cstyle)
qd208687
parents: 5786
diff changeset
  2166
	    lcyl < MINIMUM_NO_CYLINDERS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		lnhead = max(MINIMUM_NO_HEADS, lnhead / 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
		lcyl =  (capacity) / (lnhead * lnsect);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
	 * now we should have atleast SUN_MIN_CYL cylinders.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	 * If we still do not get SUN_MIN_CYL with MINIMUM_NO_HEADS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	 * and MINIMUM_NO_HEADS then return error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	if (lcyl < SUN_MIN_CYL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
		*cyl = lcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
		*nhead = lnhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
		*nsect = lnsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
 * Reduce the size of one dimention below a specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
 * limit with a minimum loss of volume.  Dimenstions are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
 * assumed to be passed in form the largest value (the one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
 * that needs to be reduced) to the smallest value.  The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
 * values will be twiddled until they are all less than or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
 * equal to their limit.  Returns the number in the new geometry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2194
static diskaddr_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
square_box(
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2196
		diskaddr_t capacity,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2197
		uint_t *dim1, uint_t lim1,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2198
		uint_t *dim2, uint_t lim2,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2199
		uint_t *dim3, uint_t lim3)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
{
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2201
	uint_t	i;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
	 * Although the routine should work with any ordering of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
	 * parameters, it's most efficient if they are passed in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
	 * in decreasing magnitude.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
	assert(*dim1 >= *dim2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
	assert(*dim2 >= *dim3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
	 * This is done in a very arbitrary manner.  We could try to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
	 * find better values but I can't come up with a method that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
	 * would run in a reasonable amount of time.  That could take
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
	 * approximately 65535 * 65535 iterations of a dozen flops each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
	 * or well over 4G flops.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
	 * First:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	 * Let's see how far we can go with bitshifts w/o losing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
	 * any blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
9889
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  2224
	for (i = 0; (((*dim1)>>i)&1) == 0 && ((*dim1)>>i) > lim1; i++)
68d0fe4c716e PSARC 2008/769 Multiple disk sector size support.
yu, larry liu - Sun Microsystems - Beijing China <Larry.Liu@Sun.COM>
parents: 9547
diff changeset
  2225
		;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	if (i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
		*dim1 = ((*dim1)>>i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
		*dim3 = ((*dim3)<<i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
	if (((*dim1) > lim1) || ((*dim2) > lim2) || ((*dim3) > lim3)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
		double 	d[4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
		 * Second:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
		 * Set the highest value at its limit then calculate errors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
		 * adjusting the 2nd highest value (we get better resolution
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
		 * that way).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
		d[1] = lim1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
		d[3] = *dim3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
		d[2] = (double)capacity/(d[1]*d[3]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		 * If we overflowed the middle term, set it to its limit and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
		 * chose a new low term.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
		if (d[2] > lim2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
			d[2] = lim2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
			d[3] = (double)capacity/(d[1]*d[2]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		 * Convert to integers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
		*dim1 = (int)d[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
		*dim2 = (int)d[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
		*dim3 = (int)d[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
	 * Fixup any other possible problems.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
	 * If this happens, we need a new disklabel format.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
	if (*dim1 > lim1) *dim1 = lim1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
	if (*dim2 > lim2) *dim2 = lim2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
	if (*dim3 > lim3) *dim3 = lim3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
	return (*dim1 * *dim2 * *dim3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
#endif /* defined(_SUNOS_VTOC_8) */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2270
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2271
/*
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2272
 * Calculate CHS values based on the capacity data.
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2273
 *
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2274
 * NOTE: This function is same as cmlb_convert_geomerty() function in
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2275
 * cmlb kernel module.
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2276
 */
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2277
static void
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2278
compute_chs_values(diskaddr_t total_capacity, diskaddr_t usable_capacity,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2279
	uint_t *pcylp, uint_t *nheadp, uint_t *nsectp)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2280
{
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2281
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2282
	/* Unlabeled SCSI floppy device */
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2283
	if (total_capacity <= 0x1000) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2284
		*nheadp = 2;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2285
		*pcylp = 80;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2286
		*nsectp = total_capacity / (80 * 2);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2287
		return;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2288
	}
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2289
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2290
	/*
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2291
	 * For all devices we calculate cylinders using the heads and sectors
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2292
	 * we assign based on capacity of the device.  The algorithm is
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2293
	 * designed to be compatible with the way other operating systems
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2294
	 * lay out fdisk tables for X86 and to insure that the cylinders never
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2295
	 * exceed 65535 to prevent problems with X86 ioctls that report
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2296
	 * geometry.
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2297
	 * For some smaller disk sizes we report geometry that matches those
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2298
	 * used by X86 BIOS usage. For larger disks, we use SPT that are
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2299
	 * multiples of 63, since other OSes that are not limited to 16-bits
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2300
	 * for cylinders stop at 63 SPT we make do by using multiples of 63 SPT.
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2301
	 *
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2302
	 * The following table (in order) illustrates some end result
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2303
	 * calculations:
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2304
	 *
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2305
	 * Maximum number of blocks 		nhead	nsect
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2306
	 *
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2307
	 * 2097152 (1GB)			64	32
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2308
	 * 16777216 (8GB)			128	32
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2309
	 * 1052819775 (502.02GB)		255  	63
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2310
	 * 2105639550 (0.98TB)			255	126
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2311
	 * 3158459325 (1.47TB)			255  	189
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2312
	 * 4211279100 (1.96TB)			255  	252
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2313
	 * 5264098875 (2.45TB)			255  	315
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2314
	 * ...
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2315
	 */
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2316
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2317
	if (total_capacity <= 0x200000) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2318
		*nheadp = 64;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2319
		*nsectp = 32;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2320
	} else if (total_capacity <= 0x01000000) {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2321
		*nheadp = 128;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2322
		*nsectp = 32;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2323
	} else {
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2324
		*nheadp = 255;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2325
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2326
		/* make nsect be smallest multiple of 63 */
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2327
		*nsectp = ((total_capacity +
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2328
		    (UINT16_MAX * 255 * 63) - 1) /
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2329
		    (UINT16_MAX * 255 * 63)) * 63;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2330
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2331
		if (*nsectp == 0)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2332
			*nsectp = (UINT16_MAX / 63) * 63;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2333
	}
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2334
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2335
	if (usable_capacity < total_capacity)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2336
		*pcylp = usable_capacity / ((*nheadp) * (*nsectp));
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2337
	else
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2338
		*pcylp = total_capacity / ((*nheadp) * (*nsectp));
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 6382
diff changeset
  2339
}