38#include <sys/libkern.h>
39#include <sys/kernel.h>
40#include <sys/sysctl.h>
47#define min(a,b) (((a)<(b))?(a):(b))
58#include <sys/endian.h>
67 for (bit = 15; bit >= 0; bit--)
78 return (
"SOFT_RESET");
82 case 0x00:
return (
"NOP FLUSHQUEUE");
83 case 0x01:
return (
"NOP AUTOPOLL");
86 case 0x03:
return (
"CFA_REQUEST_EXTENDED_ERROR");
89 case 0x01:
return (
"DSM TRIM");
94 case 0x01:
return (
"DSM_XL TRIM");
97 case 0x08:
return (
"DEVICE_RESET");
98 case 0x0b:
return (
"REQUEST_SENSE_DATA_EXT");
99 case 0x12:
return (
"GET_PHYSICAL_ELEMENT_STATUS");
100 case 0x20:
return (
"READ");
101 case 0x24:
return (
"READ48");
102 case 0x25:
return (
"READ_DMA48");
103 case 0x26:
return (
"READ_DMA_QUEUED48");
104 case 0x27:
return (
"READ_NATIVE_MAX_ADDRESS48");
105 case 0x29:
return (
"READ_MUL48");
106 case 0x2a:
return (
"READ_STREAM_DMA48");
107 case 0x2b:
return (
"READ_STREAM48");
108 case 0x2f:
return (
"READ_LOG_EXT");
109 case 0x30:
return (
"WRITE");
110 case 0x34:
return (
"WRITE48");
111 case 0x35:
return (
"WRITE_DMA48");
112 case 0x36:
return (
"WRITE_DMA_QUEUED48");
113 case 0x37:
return (
"SET_MAX_ADDRESS48");
114 case 0x39:
return (
"WRITE_MUL48");
115 case 0x3a:
return (
"WRITE_STREAM_DMA48");
116 case 0x3b:
return (
"WRITE_STREAM48");
117 case 0x3d:
return (
"WRITE_DMA_FUA48");
118 case 0x3e:
return (
"WRITE_DMA_QUEUED_FUA48");
119 case 0x3f:
return (
"WRITE_LOG_EXT");
120 case 0x40:
return (
"READ_VERIFY");
121 case 0x42:
return (
"READ_VERIFY48");
124 case 0x01:
return (
"ZERO_EXT TRIM");
129 case 0x55:
return (
"WRITE_UNCORRECTABLE48 PSEUDO");
130 case 0xaa:
return (
"WRITE_UNCORRECTABLE48 FLAGGED");
132 return "WRITE_UNCORRECTABLE48";
133 case 0x47:
return (
"READ_LOG_DMA_EXT");
134 case 0x4a:
return (
"ZAC_MANAGEMENT_IN");
135 case 0x51:
return (
"CONFIGURE_STREAM");
136 case 0x57:
return (
"WRITE_LOG_DMA_EXT");
137 case 0x5b:
return (
"TRUSTED_NON_DATA");
138 case 0x5c:
return (
"TRUSTED_RECEIVE");
139 case 0x5d:
return (
"TRUSTED_RECEIVE_DMA");
140 case 0x5e:
return (
"TRUSTED_SEND");
141 case 0x5f:
return (
"TRUSTED_SEND_DMA");
142 case 0x60:
return (
"READ_FPDMA_QUEUED");
143 case 0x61:
return (
"WRITE_FPDMA_QUEUED");
146 case 0x00:
return (
"NCQ_NON_DATA ABORT NCQ QUEUE");
147 case 0x01:
return (
"NCQ_NON_DATA DEADLINE HANDLING");
148 case 0x02:
return (
"NCQ_NON_DATA HYBRID DEMOTE BY SIZE");
149 case 0x03:
return (
"NCQ_NON_DATA HYBRID CHANGE BY LBA RANGE");
150 case 0x04:
return (
"NCQ_NON_DATA HYBRID CONTROL");
151 case 0x05:
return (
"NCQ_NON_DATA SET FEATURES");
156 case 0x06:
return (
"NCQ_NON_DATA ZERO EXT");
157 case 0x07:
return (
"NCQ_NON_DATA ZAC MANAGEMENT OUT");
159 return (
"NCQ_NON_DATA");
162 case 0x00:
return (
"SEND_FPDMA_QUEUED DATA SET MANAGEMENT");
163 case 0x01:
return (
"SEND_FPDMA_QUEUED HYBRID EVICT");
164 case 0x02:
return (
"SEND_FPDMA_QUEUED WRITE LOG DMA EXT");
165 case 0x03:
return (
"SEND_FPDMA_QUEUED ZAC MANAGEMENT OUT");
166 case 0x04:
return (
"SEND_FPDMA_QUEUED DATA SET MANAGEMENT XL");
168 return (
"SEND_FPDMA_QUEUED");
171 case 0x01:
return (
"RECEIVE_FPDMA_QUEUED READ LOG DMA EXT");
172 case 0x02:
return (
"RECEIVE_FPDMA_QUEUED ZAC MANAGEMENT IN");
174 return (
"RECEIVE_FPDMA_QUEUED");
177 return (
"SEP_ATTN IDENTIFY");
179 case 0x00:
return (
"SEP_ATTN READ BUFFER");
180 case 0x02:
return (
"SEP_ATTN RECEIVE DIAGNOSTIC RESULTS");
181 case 0x80:
return (
"SEP_ATTN WRITE BUFFER");
182 case 0x82:
return (
"SEP_ATTN SEND DIAGNOSTIC");
185 case 0x70:
return (
"SEEK");
186 case 0x77:
return (
"SET_DATE_TIME_EXT");
189 case 0x00:
return (
"GET_NATIVE_MAX_ADDRESS_EXT");
190 case 0x01:
return (
"SET_ACCESSIBLE_MAX_ADDRESS_EXT");
191 case 0x02:
return (
"FREEZE_ACCESSIBLE_MAX_ADDRESS_EXT");
193 return (
"ACCESSIBLE_MAX_ADDRESS_CONFIGURATION");
194 case 0x7C:
return (
"REMOVE_ELEMENT_AND_TRUNCATE");
195 case 0x87:
return (
"CFA_TRANSLATE_SECTOR");
196 case 0x90:
return (
"EXECUTE_DEVICE_DIAGNOSTIC");
197 case 0x92:
return (
"DOWNLOAD_MICROCODE");
198 case 0x93:
return (
"DOWNLOAD_MICROCODE_DMA");
199 case 0x9a:
return (
"ZAC_MANAGEMENT_OUT");
200 case 0xa0:
return (
"PACKET");
201 case 0xa1:
return (
"ATAPI_IDENTIFY");
202 case 0xa2:
return (
"SERVICE");
205 case 0xd0:
return (
"SMART READ ATTR VALUES");
206 case 0xd1:
return (
"SMART READ ATTR THRESHOLDS");
207 case 0xd3:
return (
"SMART SAVE ATTR VALUES");
208 case 0xd4:
return (
"SMART EXECUTE OFFLINE IMMEDIATE");
209 case 0xd5:
return (
"SMART READ LOG");
210 case 0xd6:
return (
"SMART WRITE LOG");
211 case 0xd8:
return (
"SMART ENABLE OPERATION");
212 case 0xd9:
return (
"SMART DISABLE OPERATION");
213 case 0xda:
return (
"SMART RETURN STATUS");
216 case 0xb1:
return (
"DEVICE CONFIGURATION");
217 case 0xb2:
return (
"SET_SECTOR_CONFIGURATION_EXT");
220 case 0x00:
return (
"SANITIZE_STATUS_EXT");
221 case 0x11:
return (
"CRYPTO_SCRAMBLE_EXT");
222 case 0x12:
return (
"BLOCK_ERASE_EXT");
223 case 0x14:
return (
"OVERWRITE_EXT");
224 case 0x20:
return (
"SANITIZE_FREEZE_LOCK_EXT");
225 case 0x40:
return (
"SANITIZE_ANTIFREEZE_LOCK_EXT");
227 return (
"SANITIZE_DEVICE");
228 case 0xc0:
return (
"CFA_ERASE");
229 case 0xc4:
return (
"READ_MUL");
230 case 0xc5:
return (
"WRITE_MUL");
231 case 0xc6:
return (
"SET_MULTI");
232 case 0xc7:
return (
"READ_DMA_QUEUED");
233 case 0xc8:
return (
"READ_DMA");
234 case 0xca:
return (
"WRITE_DMA");
235 case 0xcc:
return (
"WRITE_DMA_QUEUED");
236 case 0xcd:
return (
"CFA_WRITE_MULTIPLE_WITHOUT_ERASE");
237 case 0xce:
return (
"WRITE_MUL_FUA48");
238 case 0xd1:
return (
"CHECK_MEDIA_CARD_TYPE");
239 case 0xda:
return (
"GET_MEDIA_STATUS");
240 case 0xde:
return (
"MEDIA_LOCK");
241 case 0xdf:
return (
"MEDIA_UNLOCK");
242 case 0xe0:
return (
"STANDBY_IMMEDIATE");
243 case 0xe1:
return (
"IDLE_IMMEDIATE");
244 case 0xe2:
return (
"STANDBY");
245 case 0xe3:
return (
"IDLE");
246 case 0xe4:
return (
"READ_BUFFER/PM");
247 case 0xe5:
return (
"CHECK_POWER_MODE");
248 case 0xe6:
return (
"SLEEP");
249 case 0xe7:
return (
"FLUSHCACHE");
250 case 0xe8:
return (
"WRITE_BUFFER/PM");
251 case 0xe9:
return (
"READ_BUFFER_DMA");
252 case 0xea:
return (
"FLUSHCACHE48");
253 case 0xeb:
return (
"WRITE_BUFFER_DMA");
254 case 0xec:
return (
"ATA_IDENTIFY");
255 case 0xed:
return (
"MEDIA_EJECT");
262 case 0x02:
return (
"SETFEATURES ENABLE WCACHE");
263 case 0x03:
return (
"SETFEATURES SET TRANSFER MODE");
264 case 0x05:
return (
"SETFEATURES ENABLE APM");
265 case 0x06:
return (
"SETFEATURES ENABLE PUIS");
266 case 0x07:
return (
"SETFEATURES SPIN-UP");
267 case 0x0b:
return (
"SETFEATURES ENABLE WRITE READ VERIFY");
268 case 0x0c:
return (
"SETFEATURES ENABLE DEVICE LIFE CONTROL");
269 case 0x10:
return (
"SETFEATURES ENABLE SATA FEATURE");
270 case 0x41:
return (
"SETFEATURES ENABLE FREEFALL CONTROL");
271 case 0x43:
return (
"SETFEATURES SET MAX HOST INT SECT TIMES");
272 case 0x45:
return (
"SETFEATURES SET RATE BASIS");
273 case 0x4a:
return (
"SETFEATURES EXTENDED POWER CONDITIONS");
274 case 0x50:
return (
"SETFEATURES ADVANCED BACKGROUD OPERATION");
275 case 0x55:
return (
"SETFEATURES DISABLE RCACHE");
276 case 0x5d:
return (
"SETFEATURES ENABLE RELIRQ");
277 case 0x5e:
return (
"SETFEATURES ENABLE SRVIRQ");
278 case 0x62:
return (
"SETFEATURES LONG PHYS SECT ALIGN ERC");
279 case 0x63:
return (
"SETFEATURES DSN");
280 case 0x66:
return (
"SETFEATURES DISABLE DEFAULTS");
281 case 0x82:
return (
"SETFEATURES DISABLE WCACHE");
282 case 0x85:
return (
"SETFEATURES DISABLE APM");
283 case 0x86:
return (
"SETFEATURES DISABLE PUIS");
284 case 0x8b:
return (
"SETFEATURES DISABLE WRITE READ VERIFY");
285 case 0x8c:
return (
"SETFEATURES DISABLE DEVICE LIFE CONTROL");
286 case 0x90:
return (
"SETFEATURES DISABLE SATA FEATURE");
287 case 0xaa:
return (
"SETFEATURES ENABLE RCACHE");
288 case 0xC1:
return (
"SETFEATURES DISABLE FREEFALL CONTROL");
289 case 0xC3:
return (
"SETFEATURES SENSE DATA REPORTING");
290 case 0xC4:
return (
"SETFEATURES NCQ SENSE DATA RETURN");
291 case 0xCC:
return (
"SETFEATURES ENABLE DEFAULTS");
292 case 0xdd:
return (
"SETFEATURES DISABLE RELIRQ");
293 case 0xde:
return (
"SETFEATURES DISABLE SRVIRQ");
295 return "SETFEATURES";
296 case 0xf1:
return (
"SECURITY_SET_PASSWORD");
297 case 0xf2:
return (
"SECURITY_UNLOCK");
298 case 0xf3:
return (
"SECURITY_ERASE_PREPARE");
299 case 0xf4:
return (
"SECURITY_ERASE_UNIT");
300 case 0xf5:
return (
"SECURITY_FREEZE_LOCK");
301 case 0xf6:
return (
"SECURITY_DISABLE_PASSWORD");
302 case 0xf8:
return (
"READ_NATIVE_MAX_ADDRESS");
303 case 0xf9:
return (
"SET_MAX_ADDRESS");
317 sbuf_new(&sb, cmd_string, len, SBUF_FIXEDLEN);
320 error = sbuf_finish(&sb);
329 return(sbuf_data(&sb));
335 sbuf_printf(sb,
"%02x %02x %02x %02x "
336 "%02x %02x %02x %02x %02x %02x %02x %02x",
352 sbuf_new(&sb, res_string, len, SBUF_FIXEDLEN);
355 error = sbuf_finish(&sb);
364 return(sbuf_data(&sb));
371 sbuf_printf(sb,
"%02x %02x %02x %02x "
372 "%02x %02x %02x %02x %02x %02x %02x",
388 sbuf_printf(sb,
"%s. ACB: ",
402 sbuf_printf(sb,
"ATA status: %02x (%s%s%s%s%s%s%s%s)",
404 (ataio->
res.
status & 0x80) ?
"BSY " :
"",
405 (ataio->
res.
status & 0x40) ?
"DRDY " :
"",
407 (ataio->
res.
status & 0x10) ?
"SERV " :
"",
408 (ataio->
res.
status & 0x08) ?
"DRQ " :
"",
409 (ataio->
res.
status & 0x04) ?
"CORR " :
"",
410 (ataio->
res.
status & 0x02) ?
"IDX " :
"",
411 (ataio->
res.
status & 0x01) ?
"ERR" :
"");
413 sbuf_printf(sb,
", error: %02x (%s%s%s%s%s%s%s%s)",
415 (ataio->
res.
error & 0x80) ?
"ICRC " :
"",
416 (ataio->
res.
error & 0x40) ?
"UNC " :
"",
417 (ataio->
res.
error & 0x20) ?
"MC " :
"",
418 (ataio->
res.
error & 0x10) ?
"IDNF " :
"",
419 (ataio->
res.
error & 0x08) ?
"MCR " :
"",
420 (ataio->
res.
error & 0x04) ?
"ABRT " :
"",
421 (ataio->
res.
error & 0x02) ?
"NM " :
"",
422 (ataio->
res.
error & 0x01) ?
"ILI" :
"");
432 char ata[12], sata[12];
436 proto = (ident_data->config == ATA_PROTO_CFA) ?
"CFA" :
437 (ident_data->config & ATA_PROTO_ATAPI) ?
"ATAPI" :
"ATA";
439 snprintf(ata,
sizeof(ata),
"%s", proto);
440 }
else if (
ata_version(ident_data->version_major) <= 7) {
441 snprintf(ata,
sizeof(ata),
"%s-%d", proto,
443 }
else if (
ata_version(ident_data->version_major) == 8) {
444 snprintf(ata,
sizeof(ata),
"%s8-ACS", proto);
446 snprintf(ata,
sizeof(ata),
"ACS-%d %s",
447 ata_version(ident_data->version_major) - 7, proto);
449 if (ident_data->satacapabilities && ident_data->satacapabilities != 0xffff) {
450 if (ident_data->satacapabilities & ATA_SATA_GEN3)
451 snprintf(sata,
sizeof(sata),
" SATA 3.x");
452 else if (ident_data->satacapabilities & ATA_SATA_GEN2)
453 snprintf(sata,
sizeof(sata),
" SATA 2.x");
454 else if (ident_data->satacapabilities & ATA_SATA_GEN1)
455 snprintf(sata,
sizeof(sata),
" SATA 1.x");
457 snprintf(sata,
sizeof(sata),
" SATA");
460 printf(
" %s%s device\n", ata, sata);
466 const char *proto, *sata;
470 sbuf_printf(sb,
" ");
472 proto = (ident_data->config == ATA_PROTO_CFA) ?
"CFA" :
473 (ident_data->config & ATA_PROTO_ATAPI) ?
"ATAPI" :
"ATA";
478 sbuf_printf(sb,
"%s", proto);
487 sbuf_printf(sb,
"%s-%d", proto, version);
490 sbuf_printf(sb,
"%s8-ACS", proto);
493 sbuf_printf(sb,
"ACS-%d %s", version - 7, proto);
497 if (ident_data->satacapabilities && ident_data->satacapabilities != 0xffff) {
498 if (ident_data->satacapabilities & ATA_SATA_GEN3)
500 else if (ident_data->satacapabilities & ATA_SATA_GEN2)
502 else if (ident_data->satacapabilities & ATA_SATA_GEN1)
508 sbuf_printf(sb,
"%s device\n", sata);
514 char product[48], revision[16];
516 cam_strvis(product, ident_data->model,
sizeof(ident_data->model),
518 cam_strvis(revision, ident_data->revision,
sizeof(ident_data->revision),
520 printf(
"<%s %s>", product, revision);
527 sbuf_printf(sb,
"<");
529 sbuf_printf(sb,
" ");
530 cam_strvis_sbuf(sb, ident_data->revision,
sizeof(ident_data->revision), 0);
531 sbuf_printf(sb,
">");
542 printf(
" SEMB %s %s device\n", in, ins);
551 sbuf_printf(sb,
" SEMB ");
553 sbuf_printf(sb,
" ");
555 sbuf_printf(sb,
" device\n");
561 char vendor[9], product[17], revision[5], fw[5];
567 printf(
"<%s %s %s %s>", vendor, product, revision, fw);
574 sbuf_printf(sb,
"<");
576 sbuf_printf(sb,
" ");
578 sbuf_printf(sb,
" ");
580 sbuf_printf(sb,
" ");
582 sbuf_printf(sb,
">");
588 if ((ident_data->pss & ATA_PSS_VALID_MASK) == ATA_PSS_VALID_VALUE &&
589 (ident_data->pss & ATA_PSS_LSSABOVE512)) {
590 return (((u_int32_t)ident_data->lss_1 |
591 ((u_int32_t)ident_data->lss_2 << 16)) * 2);
599 if ((ident_data->pss & ATA_PSS_VALID_MASK) == ATA_PSS_VALID_VALUE) {
600 if (ident_data->pss & ATA_PSS_MULTLS) {
602 (1 << (ident_data->pss & ATA_PSS_LSPPS)));
613 if ((ident_data->lsalign & 0xc000) == 0x4000) {
615 (ident_data->lsalign & 0x3fff));
622 uint32_t lba, uint8_t sector_count)
624 bzero(&ataio->
cmd,
sizeof(ataio->
cmd));
626 if (cmd == ATA_READ_DMA ||
627 cmd == ATA_READ_DMA_QUEUED ||
628 cmd == ATA_WRITE_DMA ||
629 cmd == ATA_WRITE_DMA_QUEUED ||
630 cmd == ATA_TRUSTED_RECEIVE_DMA ||
631 cmd == ATA_TRUSTED_SEND_DMA ||
632 cmd == ATA_DOWNLOAD_MICROCODE_DMA ||
633 cmd == ATA_READ_BUFFER_DMA ||
634 cmd == ATA_WRITE_BUFFER_DMA)
641 ataio->
cmd.
device = ATA_DEV_LBA | ((lba >> 24) & 0x0f);
647 uint64_t lba, uint16_t sector_count)
651 if (cmd == ATA_READ_DMA48 ||
652 cmd == ATA_READ_DMA_QUEUED48 ||
653 cmd == ATA_READ_STREAM_DMA48 ||
654 cmd == ATA_WRITE_DMA48 ||
655 cmd == ATA_WRITE_DMA_FUA48 ||
656 cmd == ATA_WRITE_DMA_QUEUED48 ||
657 cmd == ATA_WRITE_DMA_QUEUED_FUA48 ||
658 cmd == ATA_WRITE_STREAM_DMA48 ||
659 cmd == ATA_DATA_SET_MANAGEMENT ||
660 cmd == ATA_READ_LOG_DMA_EXT ||
661 cmd == ATA_WRITE_LOG_DMA_EXT)
680 uint64_t lba, uint16_t sector_count)
702 bzero(&ataio->
cmd,
sizeof(ataio->
cmd));
710 bzero(&ataio->
cmd,
sizeof(ataio->
cmd));
720 bzero(&ataio->
cmd,
sizeof(ataio->
cmd));
734 uint32_t log_address, uint32_t page_number, uint16_t block_count,
735 uint32_t protocol, uint8_t *data_ptr, uint32_t dxfer_len,
749 lba = (((uint64_t)page_number & 0xff00) << 32) |
750 ((page_number & 0x00ff) << 8) |
751 (log_address & 0xff);
764 u_int16_t *ptr = (u_int16_t*)(buf + len);
766 while (--ptr >= (u_int16_t*)buf)
767 *ptr = be16toh(*ptr);
775 for (ptr = buf; ptr < buf+len; ++ptr)
776 if (!*ptr || *ptr ==
'_')
778 for (ptr = buf + len - 1; ptr >= buf && *ptr ==
' '; --ptr)
787 for (i = j = blank = 0 ; i < len; i++) {
788 if (blank && src[i] ==
' ')
continue;
789 if (blank && src[i] !=
' ') {
808 if (ap->atavalid & ATA_FLAG_64_70) {
809 if (ap->apiomodes & 0x02)
811 if (ap->apiomodes & 0x01)
814 if (ap->mwdmamodes & 0x04)
816 if (ap->mwdmamodes & 0x02)
818 if (ap->mwdmamodes & 0x01)
820 if ((ap->retired_piomode & ATA_RETIRED_PIO_MASK) == 0x200)
822 if ((ap->retired_piomode & ATA_RETIRED_PIO_MASK) == 0x100)
824 if ((ap->retired_piomode & ATA_RETIRED_PIO_MASK) == 0x000)
832 if (ap->mwdmamodes & 0x04)
834 if (ap->mwdmamodes & 0x02)
836 if (ap->mwdmamodes & 0x01)
844 if (ap->atavalid & ATA_FLAG_88) {
845 if (ap->udmamodes & 0x40)
847 if (ap->udmamodes & 0x20)
849 if (ap->udmamodes & 0x10)
851 if (ap->udmamodes & 0x08)
853 if (ap->udmamodes & 0x04)
855 if (ap->udmamodes & 0x02)
857 if (ap->udmamodes & 0x01)
868 maxmode = ATA_DMA_MAX;
880 case -1:
return "UNSUPPORTED";
881 case 0:
return "NONE";
882 case ATA_PIO0:
return "PIO0";
883 case ATA_PIO1:
return "PIO1";
884 case ATA_PIO2:
return "PIO2";
885 case ATA_PIO3:
return "PIO3";
886 case ATA_PIO4:
return "PIO4";
887 case ATA_WDMA0:
return "WDMA0";
888 case ATA_WDMA1:
return "WDMA1";
889 case ATA_WDMA2:
return "WDMA2";
890 case ATA_UDMA0:
return "UDMA0";
891 case ATA_UDMA1:
return "UDMA1";
892 case ATA_UDMA2:
return "UDMA2";
893 case ATA_UDMA3:
return "UDMA3";
894 case ATA_UDMA4:
return "UDMA4";
895 case ATA_UDMA5:
return "UDMA5";
896 case ATA_UDMA6:
return "UDMA6";
898 if (mode & ATA_DMA_MASK)
908 if (!strcasecmp(str,
"PIO0"))
return (ATA_PIO0);
909 if (!strcasecmp(str,
"PIO1"))
return (ATA_PIO1);
910 if (!strcasecmp(str,
"PIO2"))
return (ATA_PIO2);
911 if (!strcasecmp(str,
"PIO3"))
return (ATA_PIO3);
912 if (!strcasecmp(str,
"PIO4"))
return (ATA_PIO4);
913 if (!strcasecmp(str,
"WDMA0"))
return (ATA_WDMA0);
914 if (!strcasecmp(str,
"WDMA1"))
return (ATA_WDMA1);
915 if (!strcasecmp(str,
"WDMA2"))
return (ATA_WDMA2);
916 if (!strcasecmp(str,
"UDMA0"))
return (ATA_UDMA0);
917 if (!strcasecmp(str,
"UDMA16"))
return (ATA_UDMA0);
918 if (!strcasecmp(str,
"UDMA1"))
return (ATA_UDMA1);
919 if (!strcasecmp(str,
"UDMA25"))
return (ATA_UDMA1);
920 if (!strcasecmp(str,
"UDMA2"))
return (ATA_UDMA2);
921 if (!strcasecmp(str,
"UDMA33"))
return (ATA_UDMA2);
922 if (!strcasecmp(str,
"UDMA3"))
return (ATA_UDMA3);
923 if (!strcasecmp(str,
"UDMA44"))
return (ATA_UDMA3);
924 if (!strcasecmp(str,
"UDMA4"))
return (ATA_UDMA4);
925 if (!strcasecmp(str,
"UDMA66"))
return (ATA_UDMA4);
926 if (!strcasecmp(str,
"UDMA5"))
return (ATA_UDMA5);
927 if (!strcasecmp(str,
"UDMA100"))
return (ATA_UDMA5);
928 if (!strcasecmp(str,
"UDMA6"))
return (ATA_UDMA6);
929 if (!strcasecmp(str,
"UDMA133"))
return (ATA_UDMA6);
1006 struct ata_params *ident;
1009 ident = (
struct ata_params *)identbuffer;
1012 sizeof(ident->model)) == 0)
1014 sizeof(ident->revision)) == 0)) {
1024 struct ata_params *ident;
1027 ident = (
struct ata_params *)identbuffer;
1030 sizeof(ident->model)) == 0)
1032 sizeof(ident->revision)) == 0)) {
1040 u_int32_t retries,
void (*cbfcnp)(
struct cam_periph *,
union ccb*),
1041 uint8_t tag_action,
int pcv, uint8_t page_code,
1042 uint8_t *data_ptr, uint16_t length, uint32_t timeout)
1045 length = min(length, 1020);
1046 length = (length + 3) & ~3;
1056 pcv ? page_code : 0, 0x02, length / 4);
1061 u_int32_t retries,
void (*cbfcnp)(
struct cam_periph *,
union ccb *),
1062 uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
1065 length = min(length, 1020);
1066 length = (length + 3) & ~3;
1076 length > 0 ? data_ptr[0] : 0, 0x82, length / 4);
1081 u_int32_t retries,
void (*cbfcnp)(
struct cam_periph *,
union ccb*),
1082 uint8_t tag_action, uint8_t page_code,
1083 uint8_t *data_ptr, uint16_t length, uint32_t timeout)
1086 length = min(length, 1020);
1087 length = (length + 3) & ~3;
1097 page_code, 0x00, length / 4);
1102 u_int32_t retries,
void (*cbfcnp)(
struct cam_periph *,
union ccb *),
1103 uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
1106 length = min(length, 1020);
1107 length = (length + 3) & ~3;
1117 length > 0 ? data_ptr[0] : 0, 0x80, length / 4);
1123 int use_ncq, uint8_t zm_action, uint64_t zone_id,
1124 uint8_t zone_flags, uint16_t sector_count, uint8_t *data_ptr,
1125 uint32_t dxfer_len, uint32_t timeout)
1127 uint8_t command_out, ata_flags;
1128 uint16_t features_out, sectors_out;
1132 command_out = ATA_ZAC_MANAGEMENT_OUT;
1133 features_out = (zm_action & 0xf) | (zone_flags << 8);
1134 if (dxfer_len == 0) {
1140 sectors_out = ((dxfer_len >> 9) & 0xffff);
1144 if (dxfer_len == 0) {
1145 command_out = ATA_NCQ_NON_DATA;
1146 features_out = ATA_NCQ_ZAC_MGMT_OUT;
1149 command_out = ATA_SEND_FPDMA_QUEUED;
1152 sectors_out = ATA_SFPDMA_ZAC_MGMT_OUT << 8;
1161 if (dxfer_len == (65536 * 512)) {
1170 features_out = ((dxfer_len >> 9) & 0xffff);
1173 auxiliary = (zm_action & 0xf) | (zone_flags << 8);
1194 if (auxiliary != 0) {
1196 ataio->
aux = auxiliary;
1203 int use_ncq, uint8_t zm_action, uint64_t zone_id,
1204 uint8_t zone_flags, uint8_t *data_ptr, uint32_t dxfer_len,
1207 uint8_t command_out, ata_flags;
1208 uint16_t features_out, sectors_out;
1212 command_out = ATA_ZAC_MANAGEMENT_IN;
1214 features_out = (zm_action & 0xf) | (zone_flags << 8);
1216 sectors_out = ((dxfer_len >> 9) & 0xffff);
1219 command_out = ATA_RECV_FPDMA_QUEUED;
1220 sectors_out = ATA_RFPDMA_ZAC_MGMT_IN << 8;
1221 auxiliary = (zm_action & 0xf) | (zone_flags << 8);
1230 if (dxfer_len == (65536 * 512)) {
1239 features_out = ((dxfer_len >> 9) & 0xffff);
1259 if (auxiliary != 0) {
1261 ataio->
aux = auxiliary;
1270 for (ptr = (int16_t *)ident_buf;
1271 ptr < (int16_t *)ident_buf +
sizeof(
struct ata_params)/2; ptr++) {
1272 *ptr = le16toh(*ptr);
1274 if (strncmp(ident_buf->model,
"FX", 2) &&
1275 strncmp(ident_buf->model,
"NEC", 3) &&
1276 strncmp(ident_buf->model,
"Pioneer", 7) &&
1277 strncmp(ident_buf->model,
"SHARP", 5)) {
1278 ata_bswap(ident_buf->model,
sizeof(ident_buf->model));
1279 ata_bswap(ident_buf->revision,
sizeof(ident_buf->revision));
1280 ata_bswap(ident_buf->serial,
sizeof(ident_buf->serial));
1282 ata_btrim(ident_buf->model,
sizeof(ident_buf->model));
1283 ata_bpack(ident_buf->model, ident_buf->model,
sizeof(ident_buf->model));
1284 ata_btrim(ident_buf->revision,
sizeof(ident_buf->revision));
1285 ata_bpack(ident_buf->revision, ident_buf->revision,
sizeof(ident_buf->revision));
1286 ata_btrim(ident_buf->serial,
sizeof(ident_buf->serial));
1287 ata_bpack(ident_buf->serial, ident_buf->serial,
sizeof(ident_buf->serial));
void ata_bpack(int8_t *src, int8_t *dst, int len)
void semb_print_ident_short(struct sep_identify_data *ident_data)
int ata_res_sbuf(struct ata_res *res, struct sbuf *sb)
void ata_pm_read_cmd(struct ccb_ataio *ataio, int reg, int port)
char * ata_cmd_string(struct ata_cmd *cmd, char *cmd_string, size_t len)
void semb_send_diagnostic(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
u_int ata_revision2speed(int revision)
void ata_bswap(int8_t *buf, int len)
void ata_print_ident(struct ata_params *ident_data)
void ata_zac_mgmt_out(struct ccb_ataio *ataio, uint32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), int use_ncq, uint8_t zm_action, uint64_t zone_id, uint8_t zone_flags, uint16_t sector_count, uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout)
char * ata_mode2string(int mode)
int ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry)
void ata_param_fixup(struct ata_params *ident_buf)
int ata_command_sbuf(struct ccb_ataio *ataio, struct sbuf *sb)
void ata_zac_mgmt_in(struct ccb_ataio *ataio, uint32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), int use_ncq, uint8_t zm_action, uint64_t zone_id, uint8_t zone_flags, uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout)
uint64_t ata_logical_sector_offset(struct ata_params *ident_data)
void ata_reset_cmd(struct ccb_ataio *ataio)
int ata_max_wmode(struct ata_params *ap)
void ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint32_t val)
void ata_read_log(struct ccb_ataio *ataio, uint32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint32_t log_address, uint32_t page_number, uint16_t block_count, uint32_t protocol, uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout)
void semb_print_ident(struct sep_identify_data *ident_data)
void semb_print_ident_short_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb)
int ata_status_sbuf(struct ccb_ataio *ataio, struct sbuf *sb)
void semb_write_buffer(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
void ata_print_ident_short(struct ata_params *ident_data)
void ata_print_ident_sbuf(struct ata_params *ident_data, struct sbuf *sb)
void ata_print_ident_short_sbuf(struct ata_params *ident_data, struct sbuf *sb)
void semb_read_buffer(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, uint8_t page_code, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
void ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features, uint64_t lba, uint16_t sector_count)
int ata_identify_match(caddr_t identbuffer, caddr_t table_entry)
int ata_max_pmode(struct ata_params *ap)
uint32_t ata_logical_sector_size(struct ata_params *ident_data)
char * ata_op_string(struct ata_cmd *cmd)
void ata_cmd_sbuf(struct ata_cmd *cmd, struct sbuf *sb)
int ata_speed2revision(u_int speed)
void ata_ncq_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint64_t lba, uint16_t sector_count)
uint64_t ata_physical_sector_size(struct ata_params *ident_data)
int ata_max_mode(struct ata_params *ap, int maxmode)
char * ata_res_string(struct ata_res *res, char *res_string, size_t len)
int ata_max_umode(struct ata_params *ap)
int ata_string2mode(char *str)
void semb_receive_diagnostic_results(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, int pcv, uint8_t page_code, uint8_t *data_ptr, uint16_t length, uint32_t timeout)
void semb_print_ident_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb)
void ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features, uint32_t lba, uint8_t sector_count)
u_int ata_mode2speed(int mode)
void ata_btrim(int8_t *buf, int len)
#define CAM_ATAIO_NEEDRESULT
#define CAM_ATAIO_CONTROL
int cam_strmatch(const u_int8_t *str, const u_int8_t *pattern, int str_len)
void cam_strvis_sbuf(struct sbuf *sb, const u_int8_t *src, int srclen, uint32_t flags)
void cam_strvis(u_int8_t *dst, const u_int8_t *src, int srclen, int dstlen)
static __inline void cam_fill_ataio(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int tag_action __unused, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int32_t timeout)
u_int8_t sector_count_exp
u_int8_t sector_count_exp
char revision[SID_REVISION_SIZE+1]
char product[SID_PRODUCT_SIZE+1]