]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Usb/UsbBotPei/PeiAtapi.c
IntelSiliconPkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbBotPei / PeiAtapi.c
CommitLineData
4b1bf81c 1/** @file\r
2Pei USB ATATPI command implementations.\r
3\r
a2617ed6 4Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>\r
4b1bf81c 5 \r
6This program and the accompanying materials\r
7are licensed and made available under the terms and conditions\r
8of the BSD License which accompanies this distribution. The\r
9full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "UsbBotPeim.h"\r
18#include "BotPeim.h"\r
19\r
20#define MAXSENSEKEY 5\r
21\r
22/**\r
23 Sends out ATAPI Inquiry Packet Command to the specified device. This command will\r
24 return INQUIRY data of the device.\r
25\r
26 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
27 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
28\r
29 @retval EFI_SUCCESS Inquiry command completes successfully.\r
30 @retval EFI_DEVICE_ERROR Inquiry command failed.\r
31\r
32**/\r
33EFI_STATUS\r
34PeiUsbInquiry (\r
35 IN EFI_PEI_SERVICES **PeiServices,\r
36 IN PEI_BOT_DEVICE *PeiBotDevice\r
37 )\r
38{\r
39 ATAPI_PACKET_COMMAND Packet;\r
40 EFI_STATUS Status;\r
41 ATAPI_INQUIRY_DATA Idata;\r
42\r
43 //\r
44 // fill command packet\r
45 //\r
46 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
47 ZeroMem (&Idata, sizeof (ATAPI_INQUIRY_DATA));\r
48\r
49 Packet.Inquiry.opcode = ATA_CMD_INQUIRY;\r
50 Packet.Inquiry.page_code = 0;\r
51 Packet.Inquiry.allocation_length = 36;\r
52\r
53 //\r
54 // Send scsi INQUIRY command packet.\r
55 // According to SCSI Primary Commands-2 spec, host only needs to\r
56 // retrieve the first 36 bytes for standard INQUIRY data.\r
57 //\r
58 Status = PeiAtapiCommand (\r
59 PeiServices,\r
60 PeiBotDevice,\r
61 &Packet,\r
62 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
63 &Idata,\r
64 36,\r
65 EfiUsbDataIn,\r
66 2000\r
67 );\r
68\r
69 if (EFI_ERROR (Status)) {\r
70 return EFI_DEVICE_ERROR;\r
71 }\r
72\r
73 if ((Idata.peripheral_type & 0x1f) == 0x05) {\r
74 PeiBotDevice->DeviceType = USBCDROM;\r
75 PeiBotDevice->Media.BlockSize = 0x800;\r
3fe5862f
FT
76 PeiBotDevice->Media2.ReadOnly = TRUE;\r
77 PeiBotDevice->Media2.RemovableMedia = TRUE;\r
78 PeiBotDevice->Media2.BlockSize = 0x800;\r
4b1bf81c 79 } else {\r
80 PeiBotDevice->DeviceType = USBFLOPPY;\r
81 PeiBotDevice->Media.BlockSize = 0x200;\r
3fe5862f
FT
82 PeiBotDevice->Media2.ReadOnly = FALSE;\r
83 PeiBotDevice->Media2.RemovableMedia = TRUE;\r
84 PeiBotDevice->Media2.BlockSize = 0x200;\r
4b1bf81c 85 }\r
86\r
87 return EFI_SUCCESS;\r
88}\r
89\r
90/**\r
91 Sends out ATAPI Test Unit Ready Packet Command to the specified device\r
92 to find out whether device is accessible.\r
93\r
94 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
95 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
96\r
97 @retval EFI_SUCCESS TestUnit command executed successfully.\r
98 @retval EFI_DEVICE_ERROR Device cannot be executed TestUnit command successfully.\r
99\r
100**/\r
101EFI_STATUS\r
102PeiUsbTestUnitReady (\r
103 IN EFI_PEI_SERVICES **PeiServices,\r
104 IN PEI_BOT_DEVICE *PeiBotDevice\r
105 )\r
106{\r
107 ATAPI_PACKET_COMMAND Packet;\r
108 EFI_STATUS Status;\r
109\r
110 //\r
111 // fill command packet\r
112 //\r
113 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
114 Packet.TestUnitReady.opcode = ATA_CMD_TEST_UNIT_READY;\r
115\r
116 //\r
117 // send command packet\r
118 //\r
119 Status = PeiAtapiCommand (\r
120 PeiServices,\r
121 PeiBotDevice,\r
122 &Packet,\r
123 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
124 NULL,\r
125 0,\r
126 EfiUsbNoData,\r
127 2000\r
128 );\r
129\r
130 if (EFI_ERROR (Status)) {\r
131 return EFI_DEVICE_ERROR;\r
132 }\r
133\r
134 return EFI_SUCCESS;\r
135}\r
136\r
137/**\r
138 Sends out ATAPI Request Sense Packet Command to the specified device.\r
139\r
140 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
141 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
142 @param SenseCounts Length of sense buffer.\r
143 @param SenseKeyBuffer Pointer to sense buffer.\r
144\r
145 @retval EFI_SUCCESS Command executed successfully.\r
146 @retval EFI_DEVICE_ERROR Some device errors happen.\r
147\r
148**/\r
149EFI_STATUS\r
150PeiUsbRequestSense (\r
151 IN EFI_PEI_SERVICES **PeiServices,\r
152 IN PEI_BOT_DEVICE *PeiBotDevice,\r
153 OUT UINTN *SenseCounts,\r
154 IN UINT8 *SenseKeyBuffer\r
155 )\r
156{\r
3fe5862f
FT
157 EFI_STATUS Status;\r
158 ATAPI_PACKET_COMMAND Packet;\r
159 UINT8 *Ptr;\r
160 BOOLEAN SenseReq;\r
4b1bf81c 161 ATAPI_REQUEST_SENSE_DATA *Sense;\r
162\r
163 *SenseCounts = 0;\r
164\r
165 //\r
166 // fill command packet for Request Sense Packet Command\r
167 //\r
168 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
169 Packet.RequestSence.opcode = ATA_CMD_REQUEST_SENSE;\r
170 Packet.RequestSence.allocation_length = (UINT8) sizeof (ATAPI_REQUEST_SENSE_DATA);\r
171\r
172 Ptr = SenseKeyBuffer;\r
173\r
174 SenseReq = TRUE;\r
175\r
176 //\r
177 // request sense data from device continuously\r
178 // until no sense data exists in the device.\r
179 //\r
180 while (SenseReq) {\r
181 Sense = (ATAPI_REQUEST_SENSE_DATA *) Ptr;\r
182\r
183 //\r
184 // send out Request Sense Packet Command and get one Sense\r
185 // data form device.\r
186 //\r
187 Status = PeiAtapiCommand (\r
188 PeiServices,\r
189 PeiBotDevice,\r
190 &Packet,\r
191 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
192 (VOID *) Ptr,\r
193 sizeof (ATAPI_REQUEST_SENSE_DATA),\r
194 EfiUsbDataIn,\r
195 2000\r
196 );\r
197\r
198 //\r
199 // failed to get Sense data\r
200 //\r
201 if (EFI_ERROR (Status)) {\r
202 if (*SenseCounts == 0) {\r
203 return EFI_DEVICE_ERROR;\r
204 } else {\r
205 return EFI_SUCCESS;\r
206 }\r
207 }\r
208\r
209 if (Sense->sense_key != ATA_SK_NO_SENSE) {\r
210\r
211 Ptr += sizeof (ATAPI_REQUEST_SENSE_DATA);\r
212 //\r
213 // Ptr is byte based pointer\r
214 //\r
215 (*SenseCounts)++;\r
216\r
217 if (*SenseCounts == MAXSENSEKEY) {\r
218 break;\r
219 }\r
220\r
221 } else {\r
222 //\r
223 // when no sense key, skip out the loop\r
224 //\r
225 SenseReq = FALSE;\r
226 }\r
227 }\r
228\r
229 return EFI_SUCCESS;\r
230}\r
231\r
232/**\r
233 Sends out ATAPI Read Capacity Packet Command to the specified device.\r
234 This command will return the information regarding the capacity of the\r
235 media in the device.\r
236\r
237 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
238 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
239\r
240 @retval EFI_SUCCESS Command executed successfully.\r
241 @retval EFI_DEVICE_ERROR Some device errors happen.\r
242\r
243**/\r
244EFI_STATUS\r
245PeiUsbReadCapacity (\r
246 IN EFI_PEI_SERVICES **PeiServices,\r
247 IN PEI_BOT_DEVICE *PeiBotDevice\r
248 )\r
249{\r
3fe5862f
FT
250 EFI_STATUS Status;\r
251 ATAPI_PACKET_COMMAND Packet;\r
4b1bf81c 252 ATAPI_READ_CAPACITY_DATA Data;\r
3fe5862f 253 UINT32 LastBlock;\r
4b1bf81c 254\r
255 ZeroMem (&Data, sizeof (ATAPI_READ_CAPACITY_DATA));\r
256 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
257\r
258 Packet.Inquiry.opcode = ATA_CMD_READ_CAPACITY;\r
259\r
260 //\r
261 // send command packet\r
262 //\r
263 Status = PeiAtapiCommand (\r
264 PeiServices,\r
265 PeiBotDevice,\r
266 &Packet,\r
267 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
268 (VOID *) &Data,\r
269 sizeof (ATAPI_READ_CAPACITY_DATA),\r
270 EfiUsbDataIn,\r
271 2000\r
272 );\r
273\r
274 if (EFI_ERROR (Status)) {\r
275 return EFI_DEVICE_ERROR;\r
276 }\r
a2617ed6 277 LastBlock = ((UINT32) Data.LastLba3 << 24) | (Data.LastLba2 << 16) | (Data.LastLba1 << 8) | Data.LastLba0;\r
4b1bf81c 278\r
3fe5862f
FT
279 if (LastBlock == 0xFFFFFFFF) {\r
280 DEBUG ((EFI_D_INFO, "The usb device LBA count is larger than 0xFFFFFFFF!\n"));\r
281 }\r
282\r
283 PeiBotDevice->Media.LastBlock = LastBlock;\r
284 PeiBotDevice->Media.MediaPresent = TRUE;\r
4b1bf81c 285\r
3fe5862f
FT
286 PeiBotDevice->Media2.LastBlock = LastBlock;\r
287 PeiBotDevice->Media2.MediaPresent = TRUE;\r
4b1bf81c 288\r
289 return EFI_SUCCESS;\r
290}\r
291\r
292/**\r
293 Sends out ATAPI Read Format Capacity Data Command to the specified device.\r
294 This command will return the information regarding the capacity of the\r
295 media in the device.\r
296\r
297 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
298 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
299\r
300 @retval EFI_SUCCESS Command executed successfully.\r
301 @retval EFI_DEVICE_ERROR Some device errors happen.\r
302\r
303**/\r
304EFI_STATUS\r
305PeiUsbReadFormattedCapacity (\r
306 IN EFI_PEI_SERVICES **PeiServices,\r
307 IN PEI_BOT_DEVICE *PeiBotDevice\r
308 )\r
309{\r
3fe5862f
FT
310 EFI_STATUS Status;\r
311 ATAPI_PACKET_COMMAND Packet;\r
4b1bf81c 312 ATAPI_READ_FORMAT_CAPACITY_DATA FormatData;\r
3fe5862f 313 UINT32 LastBlock;\r
4b1bf81c 314\r
315 ZeroMem (&FormatData, sizeof (ATAPI_READ_FORMAT_CAPACITY_DATA));\r
316 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
317\r
318 Packet.ReadFormatCapacity.opcode = ATA_CMD_READ_FORMAT_CAPACITY;\r
319 Packet.ReadFormatCapacity.allocation_length_lo = 12;\r
320\r
321 //\r
322 // send command packet\r
323 //\r
324 Status = PeiAtapiCommand (\r
325 PeiServices,\r
326 PeiBotDevice,\r
327 &Packet,\r
328 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
329 (VOID *) &FormatData,\r
330 sizeof (ATAPI_READ_FORMAT_CAPACITY_DATA),\r
331 EfiUsbDataIn,\r
332 2000\r
333 );\r
334\r
335 if (EFI_ERROR (Status)) {\r
336 return EFI_DEVICE_ERROR;\r
337 }\r
338\r
339 if (FormatData.DesCode == 3) {\r
340 //\r
341 // Media is not present\r
342 //\r
343 PeiBotDevice->Media.MediaPresent = FALSE;\r
344 PeiBotDevice->Media.LastBlock = 0;\r
3fe5862f
FT
345 PeiBotDevice->Media2.MediaPresent = FALSE;\r
346 PeiBotDevice->Media2.LastBlock = 0;\r
4b1bf81c 347\r
348 } else {\r
a2617ed6 349 LastBlock = ((UINT32) FormatData.LastLba3 << 24) | (FormatData.LastLba2 << 16) | (FormatData.LastLba1 << 8) | FormatData.LastLba0;\r
3fe5862f
FT
350 if (LastBlock == 0xFFFFFFFF) {\r
351 DEBUG ((EFI_D_INFO, "The usb device LBA count is larger than 0xFFFFFFFF!\n"));\r
352 }\r
4b1bf81c 353\r
3fe5862f 354 PeiBotDevice->Media.LastBlock = LastBlock;\r
4b1bf81c 355\r
356 PeiBotDevice->Media.LastBlock--;\r
357\r
358 PeiBotDevice->Media.MediaPresent = TRUE;\r
3fe5862f
FT
359\r
360 PeiBotDevice->Media2.MediaPresent = TRUE;\r
361 PeiBotDevice->Media2.LastBlock = PeiBotDevice->Media.LastBlock;\r
4b1bf81c 362 }\r
363\r
364 return EFI_SUCCESS;\r
365}\r
366\r
367/**\r
368 Execute Read(10) ATAPI command on a specific SCSI target.\r
369\r
370 Executes the ATAPI Read(10) command on the ATAPI target specified by PeiBotDevice.\r
371\r
372 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
373 @param PeiBotDevice The pointer to PEI_BOT_DEVICE instance.\r
374 @param Buffer The pointer to data buffer.\r
375 @param Lba The start logic block address of reading.\r
376 @param NumberOfBlocks The block number of reading.\r
377\r
378 @retval EFI_SUCCESS Command executed successfully.\r
379 @retval EFI_DEVICE_ERROR Some device errors happen.\r
380\r
381**/\r
382EFI_STATUS\r
383PeiUsbRead10 (\r
384 IN EFI_PEI_SERVICES **PeiServices,\r
385 IN PEI_BOT_DEVICE *PeiBotDevice,\r
386 IN VOID *Buffer,\r
387 IN EFI_PEI_LBA Lba,\r
388 IN UINTN NumberOfBlocks\r
389 )\r
390{\r
391 ATAPI_PACKET_COMMAND Packet;\r
392 ATAPI_READ10_CMD *Read10Packet;\r
393 UINT16 MaxBlock;\r
394 UINT16 BlocksRemaining;\r
395 UINT16 SectorCount;\r
396 UINT32 Lba32;\r
397 UINT32 BlockSize;\r
398 UINT32 ByteCount;\r
399 VOID *PtrBuffer;\r
400 EFI_STATUS Status;\r
401 UINT16 TimeOut;\r
402\r
403 //\r
404 // prepare command packet for the Inquiry Packet Command.\r
405 //\r
406 ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));\r
407 Read10Packet = &Packet.Read10;\r
408 Lba32 = (UINT32) Lba;\r
409 PtrBuffer = Buffer;\r
410\r
411 BlockSize = (UINT32) PeiBotDevice->Media.BlockSize;\r
412\r
413 MaxBlock = (UINT16) (65535 / BlockSize);\r
414 BlocksRemaining = (UINT16) NumberOfBlocks;\r
415\r
416 Status = EFI_SUCCESS;\r
417 while (BlocksRemaining > 0) {\r
418\r
419 if (BlocksRemaining <= MaxBlock) {\r
420\r
421 SectorCount = BlocksRemaining;\r
422\r
423 } else {\r
424\r
425 SectorCount = MaxBlock;\r
426 }\r
427 //\r
428 // fill the Packet data structure\r
429 //\r
430 Read10Packet->opcode = ATA_CMD_READ_10;\r
431\r
432 //\r
433 // Lba0 ~ Lba3 specify the start logical block address of the data transfer.\r
434 // Lba0 is MSB, Lba3 is LSB\r
435 //\r
436 Read10Packet->Lba3 = (UINT8) (Lba32 & 0xff);\r
437 Read10Packet->Lba2 = (UINT8) (Lba32 >> 8);\r
438 Read10Packet->Lba1 = (UINT8) (Lba32 >> 16);\r
439 Read10Packet->Lba0 = (UINT8) (Lba32 >> 24);\r
440\r
441 //\r
442 // TranLen0 ~ TranLen1 specify the transfer length in block unit.\r
443 // TranLen0 is MSB, TranLen is LSB\r
444 //\r
445 Read10Packet->TranLen1 = (UINT8) (SectorCount & 0xff);\r
446 Read10Packet->TranLen0 = (UINT8) (SectorCount >> 8);\r
447\r
448 ByteCount = SectorCount * BlockSize;\r
449\r
450 TimeOut = (UINT16) (SectorCount * 2000);\r
451\r
452 //\r
453 // send command packet\r
454 //\r
455 Status = PeiAtapiCommand (\r
456 PeiServices,\r
457 PeiBotDevice,\r
458 &Packet,\r
459 (UINT8) sizeof (ATAPI_PACKET_COMMAND),\r
460 (VOID *) PtrBuffer,\r
461 ByteCount,\r
462 EfiUsbDataIn,\r
463 TimeOut\r
464 );\r
465\r
466 if (Status != EFI_SUCCESS) {\r
467 return Status;\r
468 }\r
469\r
470 Lba32 += SectorCount;\r
471 PtrBuffer = (UINT8 *) PtrBuffer + SectorCount * BlockSize;\r
472 BlocksRemaining = (UINT16) (BlocksRemaining - SectorCount);\r
473 }\r
474\r
475 return Status;\r
476}\r
477\r
478/** \r
479 Check if there is media according to sense data.\r
480\r
481 @param SenseData Pointer to sense data.\r
482 @param SenseCounts Count of sense data.\r
483\r
484 @retval TRUE No media\r
485 @retval FALSE Media exists\r
486\r
487**/\r
488BOOLEAN\r
489IsNoMedia (\r
490 IN ATAPI_REQUEST_SENSE_DATA *SenseData,\r
491 IN UINTN SenseCounts\r
492 )\r
493{\r
494 ATAPI_REQUEST_SENSE_DATA *SensePtr;\r
3fe5862f
FT
495 UINTN Index;\r
496 BOOLEAN NoMedia;\r
4b1bf81c 497\r
498 NoMedia = FALSE;\r
499 SensePtr = SenseData;\r
500\r
501 for (Index = 0; Index < SenseCounts; Index++) {\r
502\r
503 switch (SensePtr->sense_key) {\r
504\r
505 case ATA_SK_NOT_READY:\r
506 switch (SensePtr->addnl_sense_code) {\r
507 //\r
508 // if no media, fill IdeDev parameter with specific info.\r
509 //\r
510 case ATA_ASC_NO_MEDIA:\r
511 NoMedia = TRUE;\r
512 break;\r
513\r
514 default:\r
515 break;\r
516 }\r
517 break;\r
518\r
519 default:\r
520 break;\r
521 }\r
522\r
523 SensePtr++;\r
524 }\r
525\r
526 return NoMedia;\r
527}\r
528\r
529/** \r
530 Check if there is media error according to sense data.\r
531\r
532 @param SenseData Pointer to sense data.\r
533 @param SenseCounts Count of sense data.\r
534\r
535 @retval TRUE Media error\r
536 @retval FALSE No media error\r
537\r
538**/\r
539BOOLEAN\r
540IsMediaError (\r
541 IN ATAPI_REQUEST_SENSE_DATA *SenseData,\r
3fe5862f 542 IN UINTN SenseCounts\r
4b1bf81c 543 )\r
544{\r
545 ATAPI_REQUEST_SENSE_DATA *SensePtr;\r
3fe5862f
FT
546 UINTN Index;\r
547 BOOLEAN Error;\r
4b1bf81c 548\r
549 SensePtr = SenseData;\r
550 Error = FALSE;\r
551\r
552 for (Index = 0; Index < SenseCounts; Index++) {\r
553\r
554 switch (SensePtr->sense_key) {\r
555 //\r
556 // Medium error case\r
557 //\r
558 case ATA_SK_MEDIUM_ERROR:\r
559 switch (SensePtr->addnl_sense_code) {\r
560 case ATA_ASC_MEDIA_ERR1:\r
561 //\r
562 // fall through\r
563 //\r
564 case ATA_ASC_MEDIA_ERR2:\r
565 //\r
566 // fall through\r
567 //\r
568 case ATA_ASC_MEDIA_ERR3:\r
569 //\r
570 // fall through\r
571 //\r
572 case ATA_ASC_MEDIA_ERR4:\r
573 Error = TRUE;\r
574 break;\r
575\r
576 default:\r
577 break;\r
578 }\r
579\r
580 break;\r
581\r
582 //\r
583 // Medium upside-down case\r
584 //\r
585 case ATA_SK_NOT_READY:\r
586 switch (SensePtr->addnl_sense_code) {\r
587 case ATA_ASC_MEDIA_UPSIDE_DOWN:\r
588 Error = TRUE;\r
589 break;\r
590\r
591 default:\r
592 break;\r
593 }\r
594 break;\r
595\r
596 default:\r
597 break;\r
598 }\r
599\r
600 SensePtr++;\r
601 }\r
602\r
603 return Error;\r
604}\r
605\r
606/** \r
607 Check if media is changed according to sense data.\r
608\r
609 @param SenseData Pointer to sense data.\r
610 @param SenseCounts Count of sense data.\r
611\r
612 @retval TRUE There is media change event.\r
613 @retval FALSE media is NOT changed.\r
614\r
615**/\r
616BOOLEAN\r
617IsMediaChange (\r
618 IN ATAPI_REQUEST_SENSE_DATA *SenseData,\r
619 IN UINTN SenseCounts\r
620 )\r
621{\r
622 ATAPI_REQUEST_SENSE_DATA *SensePtr;\r
623 UINTN Index;\r
624 BOOLEAN MediaChange;\r
625\r
626 MediaChange = FALSE;\r
627\r
628 SensePtr = SenseData;\r
629\r
630 for (Index = 0; Index < SenseCounts; Index++) {\r
631 //\r
632 // catch media change sense key and addition sense data\r
633 //\r
634 switch (SensePtr->sense_key) {\r
635 case ATA_SK_UNIT_ATTENTION:\r
636 switch (SensePtr->addnl_sense_code) {\r
637 case ATA_ASC_MEDIA_CHANGE:\r
638 MediaChange = TRUE;\r
639 break;\r
640\r
641 default:\r
642 break;\r
643 }\r
644 break;\r
645\r
646 default:\r
647 break;\r
648 }\r
649\r
650 SensePtr++;\r
651 }\r
652\r
653 return MediaChange;\r
654}\r