1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22# 23# Copyright 1999 Sun Microsystems, Inc. All rights reserved. 24# Use is subject to license terms. 25# 26 27# 28#ident "%Z%%M% %I% %E% SMI" 29# 30 31Dan Mick, 2/16/1999 32 33I had to come up with some sort of synthetic device geometry in the 34case that a drive supports LBA access and therefore the BIOS's geometry 35may be wrong or too small. 36 37In despair at reading the specs, I asked the x3t13 reflector 38how one is supposed to calculate capacity: 39 40== 41X-Authentication-Warning: mage.dt.wdc.com: majordom set sender to owner-t13@dt.wdc.com using -f 42Date: Thu, 11 Feb 1999 19:16:39 -0800 (PST) 43From: Dan Mick <dan.mick@West> 44Subject: Capacity? 45To: t13@dt.wdc.com 46 47So, I'm sure I'm being naive in expecting there to be a way to 48reliably calculate the capacity of an ATA drive, but I can't make 49sense of the IDENTIFY DEVICE results, words 50 511,3,6,53,54-58,60-61 52 53Is the right algorithm for making sense of all this written down 54somewhere? I *have* searched the specs and Hale's HIW docs and 55the "ATA FAQ" from Wehman and den Hahn, and I still don't understand 56how this can be so nondeterministic. 57 58Even assertions in the specs seem to be ignored; I have a drive for 59which words 57-58 do *not* represent the product of words 54, 55, and 6056, for instance... 61== 62 63Several responses came; one from curtis_stevens@phoenix.com said "just 64use LBA", which of course doesn't answer the question about non-LBA 65drives. David_S_Thompson@notes.seagate.com said "read section 666.2.1 of ATA-4, rev 17 or above", which does help a bit. But 67the best pragmatic answer came from Hale Landis. I've tried to 68implement this algorithm in deriving the capacity and geometry 69for ata, without using "Init Drive Parameters", since the driver 70hasn't done that in recent incarnations, and I'm loath to mess 71with what the BIOS and the drive have figured out unless it 72becomes absolutely necessary. 73 74 75From: "Hale Landis" <hlandis@ibm.net> 76To: "T13 Reflector" <t13@dt.wdc.com>, "Dan Mick" <dan.mick@West> 77Date: Thu, 11 Feb 1999 23:46:59 -0700 78Subject: Re: Capacity? 79 80Dan Mick said... 81>So, I'm sure I'm being naive in expecting there to be a way to 82>reliably calculate the capacity of an ATA drive, but I can't make 83>sense of the IDENTIFY DEVICE results, words 84> 85>1,3,6,53,54-58,60-61 86> 87>Is the right algorithm for making sense of all this written down 88>somewhere? I *have* searched the specs and Hale's HIW docs and 89>the "ATA FAQ" from Wehman and den Hahn, and I still don't understand 90>how this can be so nondeterministic. 91> 92>Even assertions in the specs seem to be ignored; I have a drive for 93>which words 57-58 do *not* represent the product of words 54, 55, and 94>56, for instance... 95 96If the words [54]*[55]*[56] don't match [57:58] then the drive is 97"broken". Warning: some older drives have words 57:58 in big endian 98format (that is easy to verify!). 99 100Of course Read/Set Max do alter the drive's apparent capacity but assuming 101this feature is not being used or it is being used and implemented 102correctly... 103 104If you have no need to use CHS mode, then just ignore words 1, 3, 6 and 10553:58. Words 60:61 are the drive capacity. But even if you must use CHS 106mode, words 60:61 are still the true drive capacity but words 57:58 are 107the capacity that the current CHS geometry can address and [57:58] must be 108<= [60:61]. Oh yea, if you find that 57:58 are big endian then 60:61 are 109probably big endian too. 110 111An algorithm??? (I hope there aren't any typo's here)... 112 1131) If you are LBA only (don't use CHS) then words 60:61 are all you need, 114you are done. 115 1162) If you must use CHS then I suggest the following: 117 1182a) Check words 53:58... 119 does 53 indicate "valid", 120 is 1 <= [55] <= 16, 121 is 1 <= [56] <= 63, 122 and does [54]*[55]*[56] == [57:58]? 123 124 - Yes, you know that current CHS geometry of the drive, you are done. 125 If you don't like this geometry then issue an Init Drv Params with 126 a different heads and sectors and repeat this step. 127 128 - No, then go to 2b). 129 1302b) Does the drive support LBA and is [1]*[3]*[6] <= [60:61]? 131 132 - Yes, assume 60:61 are correct, and go to 2c) 133 134 - No, go to 2d) 135 1362c) Issue a Init Drv Params and set your favorite heads and sectors. 137 Compute the number of cylinders: 138 139 num-cyl = [60:61] / (favorite heads) * (favorite sectors) 140 141 The drive capacity is (num-cyl)*(favorite heads)*(favorite sectors). 142 And this value should be in 57:58 now. You are done. 143 1442d) Now you got a problem... 60:61 are no good, 53:58 are no good. 145 You don't have much choice but to assume that [1]*[3]*[6] is the 146 drive capacity. Issue an Init Drv Params to set the default geometry 147 from [3] and [6] -or- issue an Init Drv Params with your favorite 148 heads and sectors. Compute the number of cylinders: 149 150 num-cyl = ([1]*[3]*[6]) / (num heads) * (num sectors) 151 152 The drive capacity is (num-cyl)*(num-head)*(num-sectors). 153 154 You are done. 155 156And one final thing... If you used Init Drv Params you must now verify 157that it worked. Issue a read command and make sure you can read what you 158think is the last sector on the drive. If this read fails with ABRT or 159IDNF, you are in *BIG* trouble. 160 161All we did here was find a CHS geometry and a drive capacity that should 162work. If the drive has a Master Boot Record then this geometry may not 163have a CHS translation that matches the CHS translation that was used in 164that Master Boot Record. But I'll not go into that here (I would probably 165have to say bad things about the documents published by some of my friends 166a few years ago!). 167 168I'll say "sorry" now to all you hardware folks that read these reflector 169messages but I'm sure this will begin a long series of messages on the 170reflector that will just bore you to near death! 171 172 173+---------------+---------------------------+ 174| Hale Landis | hlandis@ibm.net | 175| Niwot, CO USA | hlandis@sugs.talisman.com | 176+---------------+---------------------------+ 177| !! Coming soon: www.talisman.com/sugs !! | 178+-------------------------------------------+ 179