|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1991,1990 Carnegie Mellon University ! 4: * All Rights Reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software and its ! 7: * documentation is hereby granted, provided that both the copyright ! 8: * notice and this permission notice appear in all copies of the ! 9: * software, derivative works or modified versions, and any portions ! 10: * thereof, and that both notices appear in supporting documentation. ! 11: * ! 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 15: * ! 16: * Carnegie Mellon requests users of this software to return to ! 17: * ! 18: * Software Distribution Coordinator or [email protected] ! 19: * School of Computer Science ! 20: * Carnegie Mellon University ! 21: * Pittsburgh PA 15213-3890 ! 22: * ! 23: * any improvements or extensions that they make and grant Carnegie Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * File: scsi_disk.c ! 28: * Author: Alessandro Forin, Carnegie Mellon University ! 29: * Date: 10/90 ! 30: * ! 31: * Middle layer of the SCSI driver: SCSI protocol implementation ! 32: * ! 33: * This file contains code for SCSI commands for DISK devices. ! 34: */ ! 35: ! 36: #include <string.h> ! 37: ! 38: #include <mach/std_types.h> ! 39: #include <scsi/compat_30.h> ! 40: ! 41: #include <scsi/scsi.h> ! 42: #include <scsi/scsi2.h> ! 43: #include <scsi/scsi_defs.h> ! 44: ! 45: #if (NSCSI > 0) ! 46: ! 47: ! 48: char *scdisk_name(internal) ! 49: boolean_t internal; ! 50: { ! 51: return internal ? "rz" : "disk"; ! 52: } ! 53: ! 54: /* ! 55: * SCSI commands partially specific to disks ! 56: */ ! 57: void scdisk_read( tgt, secno, ior) ! 58: register target_info_t *tgt; ! 59: register unsigned int secno; ! 60: io_req_t ior; ! 61: { ! 62: scsi_cmd_read_t *cmd; ! 63: register unsigned len; ! 64: unsigned int max_dma_data; ! 65: ! 66: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 67: ! 68: len = ior->io_count; ! 69: if (len > max_dma_data) ! 70: len = max_dma_data; ! 71: if (len < tgt->block_size) ! 72: len = tgt->block_size; ! 73: ! 74: cmd = (scsi_cmd_read_t*) (tgt->cmd_ptr); ! 75: cmd->scsi_cmd_code = SCSI_CMD_READ; ! 76: cmd->scsi_cmd_lun_and_lba1 = (secno>>16)&SCSI_LBA_MASK; ! 77: cmd->scsi_cmd_lba2 = (secno>> 8)&0xff; ! 78: cmd->scsi_cmd_lba3 = (secno )&0xff; ! 79: cmd->scsi_cmd_xfer_len = len / tgt->block_size; ! 80: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 81: ! 82: tgt->cur_cmd = SCSI_CMD_READ; ! 83: ! 84: scsi_go(tgt, sizeof(*cmd), len, FALSE); ! 85: } ! 86: ! 87: void scdisk_write( tgt, secno, ior) ! 88: register target_info_t *tgt; ! 89: register unsigned int secno; ! 90: io_req_t ior; ! 91: { ! 92: scsi_cmd_write_t *cmd; ! 93: unsigned len; /* in bytes */ ! 94: unsigned int max_dma_data; ! 95: ! 96: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 97: ! 98: len = ior->io_count; ! 99: if (len > max_dma_data) ! 100: len = max_dma_data; ! 101: if (len < tgt->block_size) ! 102: len = tgt->block_size; ! 103: ! 104: cmd = (scsi_cmd_write_t*) (tgt->cmd_ptr); ! 105: cmd->scsi_cmd_code = SCSI_CMD_WRITE; ! 106: cmd->scsi_cmd_lun_and_lba1 = (secno>>16)&SCSI_LBA_MASK; ! 107: cmd->scsi_cmd_lba2 = (secno>> 8)&0xff; ! 108: cmd->scsi_cmd_lba3 = (secno )&0xff; ! 109: cmd->scsi_cmd_xfer_len = len / tgt->block_size; ! 110: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 111: ! 112: tgt->cur_cmd = SCSI_CMD_WRITE; ! 113: ! 114: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 115: } ! 116: ! 117: ! 118: int scdisk_mode_select(tgt, lbn, ior, mdata, mlen, save) ! 119: register target_info_t *tgt; ! 120: register int lbn; ! 121: io_req_t ior; ! 122: char *mdata; ! 123: int mlen, save; ! 124: { ! 125: scsi_cmd_mode_select_t *cmd; ! 126: scsi_mode_select_param_t *parm; ! 127: ! 128: bzero(tgt->cmd_ptr, sizeof(*cmd) + sizeof(*parm)); ! 129: cmd = (scsi_cmd_mode_select_t*) (tgt->cmd_ptr); ! 130: cmd->scsi_cmd_code = SCSI_CMD_MODE_SELECT; ! 131: cmd->scsi_cmd_lun_and_lba1 = SCSI_CMD_MSL_PF; /* XXX only if... */ ! 132: cmd->scsi_cmd_xfer_len = sizeof(scsi_mode_select_param_t);/* no vuq */ ! 133: ! 134: parm = (scsi_mode_select_param_t*) (cmd + 1); ! 135: if (mdata) { ! 136: cmd->scsi_cmd_xfer_len = mlen; ! 137: bcopy(mdata, (char*)parm, mlen); ! 138: if (save) ! 139: cmd->scsi_cmd_lun_and_lba1 |= SCSI_CMD_MSL_SP; ! 140: } else { ! 141: /* parm->medium_type = if (floppy)disk.. */ ! 142: parm->desc_len = 8; ! 143: /* this really is the LBN */ ! 144: parm->descs[0].density_code = 0;/* XXX default XXX */ ! 145: parm->descs[0].reclen1 = (lbn>>16)&0xff; ! 146: parm->descs[0].reclen2 = (lbn>> 8)&0xff; ! 147: parm->descs[0].reclen3 = (lbn )&0xff; ! 148: mlen = sizeof(*parm); ! 149: } ! 150: ! 151: tgt->cur_cmd = SCSI_CMD_MODE_SELECT; ! 152: ! 153: scsi_go_and_wait(tgt, sizeof(*cmd) + mlen, 0, ior); ! 154: ! 155: return tgt->done; ! 156: } ! 157: ! 158: /* ! 159: * SCSI commands fully specific to disks ! 160: */ ! 161: int scsi_read_capacity( tgt, lbn, ior) ! 162: register target_info_t *tgt; ! 163: int lbn; ! 164: io_req_t ior; ! 165: { ! 166: scsi_cmd_read_capacity_t *cmd; ! 167: ! 168: bzero(tgt->cmd_ptr, sizeof(*cmd)); ! 169: cmd = (scsi_cmd_read_capacity_t*) (tgt->cmd_ptr); ! 170: cmd->scsi_cmd_code = SCSI_CMD_READ_CAPACITY; ! 171: /* all zeroes, unless... */ ! 172: if (lbn) { ! 173: cmd->scsi_cmd_rcap_flags = SCSI_CMD_RCAP_PMI; ! 174: cmd->scsi_cmd_lba1 = (lbn>>24); ! 175: cmd->scsi_cmd_lba2 = (lbn>>16)&0xff; ! 176: cmd->scsi_cmd_lba3 = (lbn>> 8)&0xff; ! 177: cmd->scsi_cmd_lba4 = (lbn )&0xff; ! 178: } ! 179: ! 180: tgt->cur_cmd = SCSI_CMD_READ_CAPACITY; ! 181: ! 182: scsi_go_and_wait(tgt, sizeof(*cmd), sizeof(scsi_rcap_data_t),ior); ! 183: ! 184: return tgt->done; ! 185: } ! 186: ! 187: void scsi_reassign_blocks( tgt, defect_list, n_defects, ior) ! 188: register target_info_t *tgt; ! 189: unsigned int *defect_list; /* In ascending order ! */ ! 190: int n_defects; ! 191: io_req_t ior; ! 192: { ! 193: scsi_cmd_reassign_blocks_t *cmd; ! 194: scsi_Ldefect_data_t *parm; ! 195: ! 196: cmd = (scsi_cmd_reassign_blocks_t*) (tgt->cmd_ptr); ! 197: cmd->scsi_cmd_code = SCSI_CMD_REASSIGN_BLOCKS; ! 198: cmd->scsi_cmd_lun_and_lba1 = 0; ! 199: cmd->scsi_cmd_lba2 = 0; ! 200: cmd->scsi_cmd_lba3 = 0; ! 201: cmd->scsi_cmd_xfer_len = 0; ! 202: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 203: ! 204: parm = (scsi_Ldefect_data_t *) (cmd + 1); ! 205: parm->res1 = parm->res2 = 0; ! 206: n_defects *= 4; /* in 4-byte-ints */ ! 207: parm->list_len_msb = n_defects >> 8; ! 208: parm->list_len_lsb = n_defects; ! 209: bcopy((char*)defect_list, (char*)parm->defects, n_defects); ! 210: ! 211: tgt->cur_cmd = SCSI_CMD_REASSIGN_BLOCKS; ! 212: ! 213: scsi_go(tgt, sizeof(*cmd) + sizeof(*parm) + (n_defects - 4), 0, FALSE); ! 214: } ! 215: ! 216: void scsi_medium_removal( tgt, allow, ior) ! 217: register target_info_t *tgt; ! 218: boolean_t allow; ! 219: io_req_t ior; ! 220: { ! 221: scsi_cmd_medium_removal_t *cmd; ! 222: ! 223: cmd = (scsi_cmd_medium_removal_t*) (tgt->cmd_ptr); ! 224: cmd->scsi_cmd_code = SCSI_CMD_PREVENT_ALLOW_REMOVAL; ! 225: cmd->scsi_cmd_lun_and_lba1 = 0; ! 226: cmd->scsi_cmd_lba2 = 0; ! 227: cmd->scsi_cmd_lba3 = 0; ! 228: cmd->scsi_cmd_pa_prevent = allow ? 0 : 1; ! 229: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 230: ! 231: ! 232: tgt->cur_cmd = SCSI_CMD_PREVENT_ALLOW_REMOVAL; ! 233: ! 234: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior); ! 235: } ! 236: ! 237: int scsi_format_unit( tgt, mode, vuqe, intlv, ior) ! 238: register target_info_t *tgt; ! 239: int mode, vuqe; ! 240: register unsigned int intlv; ! 241: io_req_t ior; ! 242: { ! 243: scsi_cmd_format_t *cmd; ! 244: char *parms; ! 245: ! 246: cmd = (scsi_cmd_format_t*) (tgt->cmd_ptr); ! 247: cmd->scsi_cmd_code = SCSI_CMD_FORMAT_UNIT; ! 248: cmd->scsi_cmd_lun_and_lba1 = ! 249: mode & (SCSI_CMD_FMT_FMTDATA|SCSI_CMD_FMT_CMPLIST|SCSI_CMD_FMT_LIST_TYPE); ! 250: cmd->scsi_cmd_lba2 = vuqe; ! 251: cmd->scsi_cmd_lba3 = intlv >> 8; ! 252: cmd->scsi_cmd_xfer_len = intlv; ! 253: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 254: ! 255: parms = (char*) cmd + 1; ! 256: if (ior->io_count) ! 257: bcopy(ior->io_data, parms, ior->io_count); ! 258: else ! 259: bzero(parms, 0xff - sizeof(*cmd)); ! 260: ! 261: tgt->cur_cmd = SCSI_CMD_FORMAT_UNIT; ! 262: ! 263: scsi_go_and_wait(tgt, sizeof(*cmd) + ior->io_count, 0, ior); ! 264: return tgt->done; ! 265: } ! 266: ! 267: ! 268: /* Group 1 Commands */ ! 269: ! 270: void scsi_long_read( tgt, secno, ior) ! 271: register target_info_t *tgt; ! 272: register unsigned int secno; ! 273: io_req_t ior; ! 274: { ! 275: scsi_cmd_long_read_t *cmd; ! 276: register unsigned len, n_blks; ! 277: unsigned int max_dma_data; ! 278: ! 279: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 280: ! 281: len = ior->io_count; ! 282: if (len > max_dma_data) ! 283: len = max_dma_data; ! 284: if (len < tgt->block_size) ! 285: len = tgt->block_size; ! 286: n_blks = len /tgt->block_size; ! 287: ! 288: cmd = (scsi_cmd_long_read_t*) (tgt->cmd_ptr); ! 289: cmd->scsi_cmd_code = SCSI_CMD_LONG_READ; ! 290: cmd->scsi_cmd_lun_and_relbit = 0; ! 291: cmd->scsi_cmd_lba1 = secno >> 24; ! 292: cmd->scsi_cmd_lba2 = secno >> 16; ! 293: cmd->scsi_cmd_lba3 = secno >> 8; ! 294: cmd->scsi_cmd_lba4 = secno; ! 295: cmd->scsi_cmd_xxx = 0; ! 296: cmd->scsi_cmd_xfer_len_1 = n_blks >> 8; ! 297: cmd->scsi_cmd_xfer_len_2 = n_blks; ! 298: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 299: ! 300: tgt->cur_cmd = SCSI_CMD_LONG_READ; ! 301: ! 302: scsi_go(tgt, sizeof(*cmd), len, FALSE); ! 303: } ! 304: ! 305: void scsi_long_write( tgt, secno, ior) ! 306: register target_info_t *tgt; ! 307: register unsigned int secno; ! 308: io_req_t ior; ! 309: { ! 310: scsi_cmd_long_write_t *cmd; ! 311: unsigned len; /* in bytes */ ! 312: unsigned int max_dma_data, n_blks; ! 313: ! 314: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 315: ! 316: len = ior->io_count; ! 317: if (len > max_dma_data) ! 318: len = max_dma_data; ! 319: if (len < tgt->block_size) ! 320: len = tgt->block_size; ! 321: n_blks = len /tgt->block_size; ! 322: ! 323: cmd = (scsi_cmd_long_write_t*) (tgt->cmd_ptr); ! 324: cmd->scsi_cmd_code = SCSI_CMD_LONG_WRITE; ! 325: cmd->scsi_cmd_lun_and_relbit = 0; ! 326: cmd->scsi_cmd_lba1 = secno >> 24; ! 327: cmd->scsi_cmd_lba2 = secno >> 16; ! 328: cmd->scsi_cmd_lba3 = secno >> 8; ! 329: cmd->scsi_cmd_lba4 = secno; ! 330: cmd->scsi_cmd_xxx = 0; ! 331: cmd->scsi_cmd_xfer_len_1 = n_blks >> 8; ! 332: cmd->scsi_cmd_xfer_len_2 = n_blks; ! 333: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 334: ! 335: tgt->cur_cmd = SCSI_CMD_LONG_WRITE; ! 336: ! 337: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 338: } ! 339: ! 340: int scdisk_verify( tgt, secno, nsectrs, ior) ! 341: register target_info_t *tgt; ! 342: int secno, nsectrs; ! 343: io_req_t ior; ! 344: { ! 345: scsi_cmd_verify_long_t *cmd; ! 346: int len; ! 347: ! 348: len = ior->io_count; ! 349: ! 350: cmd = (scsi_cmd_verify_long_t*) (tgt->cmd_ptr); ! 351: cmd->scsi_cmd_code = SCSI_CMD_VERIFY_1; ! 352: cmd->scsi_cmd_lun_and_relbit = len ? SCSI_CMD_VFY_BYTCHK : 0; ! 353: cmd->scsi_cmd_lba1 = secno >> 24; ! 354: cmd->scsi_cmd_lba2 = secno >> 16; ! 355: cmd->scsi_cmd_lba3 = secno >> 8; ! 356: cmd->scsi_cmd_lba4 = secno; ! 357: cmd->scsi_cmd_xxx = 0; ! 358: cmd->scsi_cmd_xfer_len_1 = (nsectrs) >> 8; ! 359: cmd->scsi_cmd_xfer_len_2 = nsectrs; ! 360: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 361: ! 362: tgt->cur_cmd = SCSI_CMD_VERIFY_1; ! 363: ! 364: scsi_go_and_wait(tgt, sizeof(*cmd) + len, 0, ior); ! 365: return tgt->done; ! 366: } ! 367: ! 368: ! 369: int scsi_read_defect( tgt, mode, ior) ! 370: register target_info_t *tgt; ! 371: register unsigned int mode; ! 372: io_req_t ior; ! 373: { ! 374: scsi_cmd_long_read_t *cmd; ! 375: register unsigned len; ! 376: ! 377: len = ior->io_count; ! 378: if (len > 0xffff) ! 379: len = 0xffff; ! 380: ! 381: cmd = (scsi_cmd_read_defect_t*) (tgt->cmd_ptr); ! 382: cmd->scsi_cmd_code = SCSI_CMD_READ_DEFECT_DATA; ! 383: cmd->scsi_cmd_lun_and_relbit = 0; ! 384: cmd->scsi_cmd_lba1 = mode & 0x1f; ! 385: cmd->scsi_cmd_lba2 = 0; ! 386: cmd->scsi_cmd_lba3 = 0; ! 387: cmd->scsi_cmd_lba4 = 0; ! 388: cmd->scsi_cmd_xxx = 0; ! 389: cmd->scsi_cmd_xfer_len_1 = (len) >> 8; ! 390: cmd->scsi_cmd_xfer_len_2 = (len); ! 391: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 392: ! 393: /* ++ HACK Alert */ ! 394: /* tgt->cur_cmd = SCSI_CMD_READ_DEFECT_DATA;*/ ! 395: tgt->cur_cmd = SCSI_CMD_LONG_READ; ! 396: /* -- HACK Alert */ ! 397: ! 398: scsi_go(tgt, sizeof(*cmd), len, FALSE); ! 399: iowait(ior); ! 400: return tgt->done; ! 401: } ! 402: ! 403: ! 404: #if 0 /* unused commands */ ! 405: scsi_rezero_unit( tgt, ior) ! 406: register target_info_t *tgt; ! 407: io_req_t ior; ! 408: { ! 409: scsi_cmd_rezero_t *cmd; ! 410: ! 411: cmd = (scsi_cmd_rezero_t*) (tgt->cmd_ptr); ! 412: cmd->scsi_cmd_code = SCSI_CMD_REZERO_UNIT; ! 413: cmd->scsi_cmd_lun_and_lba1 = 0; ! 414: cmd->scsi_cmd_lba2 = 0; ! 415: cmd->scsi_cmd_lba3 = 0; ! 416: cmd->scsi_cmd_xfer_len = 0; ! 417: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 418: ! 419: ! 420: tgt->cur_cmd = SCSI_CMD_REZERO_UNIT; ! 421: ! 422: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior); ! 423: ! 424: } ! 425: ! 426: scsi_seek( tgt, where, ior) ! 427: register target_info_t *tgt; ! 428: register unsigned int where; ! 429: io_req_t ior; ! 430: { ! 431: scsi_cmd_seek_t *cmd; ! 432: ! 433: cmd = (scsi_cmd_seek_t*) (tgt->cmd_ptr); ! 434: cmd->scsi_cmd_code = SCSI_CMD_SEEK; ! 435: cmd->scsi_cmd_lun_and_lba1 = (where >> 16) & 0x1f; ! 436: cmd->scsi_cmd_lba2 = where >> 8; ! 437: cmd->scsi_cmd_lba3 = where; ! 438: cmd->scsi_cmd_xfer_len = 0; ! 439: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 440: ! 441: ! 442: tgt->cur_cmd = SCSI_CMD_SEEK; ! 443: ! 444: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior); ! 445: ! 446: } ! 447: ! 448: scsi_reserve( tgt, len, id, mode, ior) ! 449: register target_info_t *tgt; ! 450: register unsigned int len; ! 451: unsigned char id; ! 452: io_req_t ior; ! 453: { ! 454: scsi_cmd_reserve_t *cmd; ! 455: ! 456: cmd = (scsi_cmd_reserve_t*) (tgt->cmd_ptr); ! 457: cmd->scsi_cmd_code = SCSI_CMD_RESERVE; ! 458: cmd->scsi_cmd_lun_and_lba1 = mode & 0x1f; ! 459: cmd->scsi_cmd_reserve_id = id; ! 460: cmd->scsi_cmd_extent_llen1 = len >> 8; ! 461: cmd->scsi_cmd_extent_llen2 = len; ! 462: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 463: ! 464: ! 465: tgt->cur_cmd = SCSI_CMD_RESERVE; ! 466: ! 467: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior); ! 468: ! 469: } ! 470: ! 471: scsi_release( tgt, id, mode, ior) ! 472: register target_info_t *tgt; ! 473: unsigned char id, mode; ! 474: io_req_t ior; ! 475: { ! 476: scsi_cmd_release_t *cmd; ! 477: ! 478: cmd = (scsi_cmd_release_t*) (tgt->cmd_ptr); ! 479: cmd->scsi_cmd_code = SCSI_CMD_RELEASE; ! 480: cmd->scsi_cmd_lun_and_lba1 = mode & 0x1f; ! 481: cmd->scsi_cmd_reserve_id = id; ! 482: cmd->scsi_cmd_lba3 = 0; ! 483: cmd->scsi_cmd_xfer_len = 0; ! 484: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 485: ! 486: ! 487: tgt->cur_cmd = SCSI_CMD_RELEASE; ! 488: ! 489: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior); ! 490: ! 491: } ! 492: ! 493: ! 494: /* Group 1 Commands */ ! 495: ! 496: scsi_long_seek( tgt, secno, ior) ! 497: register target_info_t *tgt; ! 498: io_req_t ior; ! 499: { ! 500: scsi_cmd_long_seek_t *cmd; ! 501: ! 502: cmd = (scsi_cmd_long_seek_t*) (tgt->cmd_ptr); ! 503: cmd->scsi_cmd_code = SCSI_CMD_LONG_SEEK; ! 504: cmd->scsi_cmd_lun_and_relbit = 0; ! 505: cmd->scsi_cmd_lba1 = secno >> 24; ! 506: cmd->scsi_cmd_lba2 = secno >> 16; ! 507: cmd->scsi_cmd_lba3 = secno >> 8; ! 508: cmd->scsi_cmd_lba4 = secno; ! 509: cmd->scsi_cmd_xxx = 0; ! 510: cmd->scsi_cmd_xfer_len_1 = 0; ! 511: cmd->scsi_cmd_xfer_len_2 = 0; ! 512: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 513: ! 514: tgt->cur_cmd = SCSI_CMD_LONG_SEEK; ! 515: ! 516: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 517: } ! 518: ! 519: scsi_write_verify( tgt, secno, ior) ! 520: register target_info_t *tgt; ! 521: io_req_t ior; ! 522: { ! 523: scsi_cmd_write_vfy_t *cmd; ! 524: unsigned len; /* in bytes */ ! 525: unsigned int max_dma_data, n_blks; ! 526: ! 527: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 528: ! 529: len = ior->io_count; ! 530: if (len > max_dma_data) ! 531: len = max_dma_data; ! 532: if (len < tgt->block_size) ! 533: len = tgt->block_size; ! 534: n_blks = len / tgt->block_size; ! 535: ! 536: cmd = (scsi_cmd_write_vfy_t*) (tgt->cmd_ptr); ! 537: cmd->scsi_cmd_code = SCSI_CMD_WRITE_AND_VERIFY; ! 538: cmd->scsi_cmd_lun_and_relbit = SCSI_CMD_VFY_BYTCHK; ! 539: cmd->scsi_cmd_lba1 = secno >> 24; ! 540: cmd->scsi_cmd_lba2 = secno >> 16; ! 541: cmd->scsi_cmd_lba3 = secno >> 8; ! 542: cmd->scsi_cmd_lba4 = secno; ! 543: cmd->scsi_cmd_xxx = 0; ! 544: cmd->scsi_cmd_xfer_len_1 = n_blks >> 8; ! 545: cmd->scsi_cmd_xfer_len_2 = n_blks; ! 546: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 547: ! 548: tgt->cur_cmd = SCSI_CMD_WRITE_AND_VERIFY; ! 549: ! 550: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 551: } ! 552: ! 553: scsi_search_data( tgt, secno, how, flags, ior) ! 554: register target_info_t *tgt; ! 555: io_req_t ior; ! 556: { ! 557: scsi_cmd_search_t *cmd; ! 558: unsigned len; /* in bytes */ ! 559: unsigned int max_dma_data, n_blks; ! 560: ! 561: max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; ! 562: ! 563: if (how != SCSI_CMD_SEARCH_HIGH && ! 564: how != SCSI_CMD_SEARCH_EQUAL && ! 565: how != SCSI_CMD_SEARCH_LOW) ! 566: panic("scsi_search_data"); ! 567: ! 568: len = ior->io_count; ! 569: if (len > max_dma_data) ! 570: len = max_dma_data; ! 571: n_blks = len / tgt->block_size; ! 572: ! 573: cmd = (scsi_cmd_search_t*) (tgt->cmd_ptr); ! 574: cmd->scsi_cmd_code = how; ! 575: cmd->scsi_cmd_lun_and_relbit = flags & 0x1e; ! 576: cmd->scsi_cmd_lba1 = secno >> 24; ! 577: cmd->scsi_cmd_lba2 = secno >> 16; ! 578: cmd->scsi_cmd_lba3 = secno >> 8; ! 579: cmd->scsi_cmd_lba4 = secno; ! 580: cmd->scsi_cmd_xxx = 0; ! 581: cmd->scsi_cmd_xfer_len_1 = n_blks >> 8; ! 582: cmd->scsi_cmd_xfer_len_2 = n_blks; ! 583: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 584: ! 585: tgt->cur_cmd = how; ! 586: ! 587: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 588: } ! 589: ! 590: ! 591: scsi_set_limits( tgt, secno, nblocks, inhibit, ior) ! 592: register target_info_t *tgt; ! 593: io_req_t ior; ! 594: { ! 595: scsi_cmd_set_limits_t *cmd; ! 596: ! 597: cmd = (scsi_cmd_set_limits_t*) (tgt->cmd_ptr); ! 598: cmd->scsi_cmd_code = SCSI_CMD_SET_LIMITS; ! 599: cmd->scsi_cmd_lun_and_relbit = inhibit & 0x3; ! 600: cmd->scsi_cmd_lba1 = secno >> 24; ! 601: cmd->scsi_cmd_lba2 = secno >> 16; ! 602: cmd->scsi_cmd_lba3 = secno >> 8; ! 603: cmd->scsi_cmd_lba4 = secno; ! 604: cmd->scsi_cmd_xxx = 0; ! 605: cmd->scsi_cmd_xfer_len_1 = nblocks >> 8; ! 606: cmd->scsi_cmd_xfer_len_2 = nblocks; ! 607: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ ! 608: ! 609: tgt->cur_cmd = SCSI_CMD_SET_LIMITS; ! 610: ! 611: scsi_go(tgt, sizeof(*cmd), 0, FALSE); ! 612: } ! 613: ! 614: ! 615: #endif ! 616: ! 617: #ifdef SCSI2 ! 618: scsi_lock_cache ! 619: scsi_prefetch ! 620: scsi_read_defect_data ! 621: scsi_sync_cache ! 622: scsi_write_same ! 623: #endif SCSI2 ! 624: #endif /* NSCSI > 0 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.