|
|
1.1 ! root 1: /* ! 2: * scsi.h Copyright (C) 1992 Drew Eckhardt ! 3: * Copyright (C) 1993, 1994, 1995 Eric Youngdale ! 4: * generic SCSI package header file by ! 5: * Initial versions: Drew Eckhardt ! 6: * Subsequent revisions: Eric Youngdale ! 7: * ! 8: * <[email protected]> ! 9: * ! 10: * Modified by Eric Youngdale [email protected] to ! 11: * add scatter-gather, multiple outstanding request, and other ! 12: * enhancements. ! 13: */ ! 14: ! 15: #ifndef _SCSI_H ! 16: #define _SCSI_H ! 17: ! 18: /* ! 19: * Some of the public constants are being moved to this file. ! 20: * We include it here so that what came from where is transparent. ! 21: */ ! 22: #include <linux/scsi.h> ! 23: ! 24: ! 25: /* ! 26: * Some defs, in case these are not defined elsewhere. ! 27: */ ! 28: #ifndef TRUE ! 29: # define TRUE 1 ! 30: #endif ! 31: #ifndef FALSE ! 32: # define FALSE 0 ! 33: #endif ! 34: ! 35: #ifdef MACH ! 36: #ifndef LINUX_SCSI_DEBUG ! 37: #undef DEBUG ! 38: #endif ! 39: #endif ! 40: ! 41: extern void scsi_make_blocked_list(void); ! 42: extern volatile int in_scan_scsis; ! 43: extern const unsigned char scsi_command_size[8]; ! 44: #define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7] ! 45: ! 46: #define IDENTIFY_BASE 0x80 ! 47: #define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\ ! 48: ((can_disconnect) ? 0x40 : 0) |\ ! 49: ((lun) & 0x07)) ! 50: ! 51: ! 52: ! 53: /* ! 54: * the return of the status word will be in the following format : ! 55: * The low byte is the status returned by the SCSI command, ! 56: * with vendor specific bits masked. ! 57: * ! 58: * The next byte is the message which followed the SCSI status. ! 59: * This allows a stos to be used, since the Intel is a little ! 60: * endian machine. ! 61: * ! 62: * The final byte is a host return code, which is one of the following. ! 63: * ! 64: * IE ! 65: * lsb msb ! 66: * status msg host code ! 67: * ! 68: * Our errors returned by OUR driver, NOT SCSI message. Or'd with ! 69: * SCSI message passed back to driver <IF any>. ! 70: */ ! 71: ! 72: ! 73: #define DID_OK 0x00 /* NO error */ ! 74: #define DID_NO_CONNECT 0x01 /* Couldn't connect before timeout period */ ! 75: #define DID_BUS_BUSY 0x02 /* BUS stayed busy through time out period */ ! 76: #define DID_TIME_OUT 0x03 /* TIMED OUT for other reason */ ! 77: #define DID_BAD_TARGET 0x04 /* BAD target. */ ! 78: #define DID_ABORT 0x05 /* Told to abort for some other reason */ ! 79: #define DID_PARITY 0x06 /* Parity error */ ! 80: #define DID_ERROR 0x07 /* Internal error */ ! 81: #define DID_RESET 0x08 /* Reset by somebody. */ ! 82: #define DID_BAD_INTR 0x09 /* Got an interrupt we weren't expecting. */ ! 83: #define DRIVER_OK 0x00 /* Driver status */ ! 84: ! 85: /* ! 86: * These indicate the error that occurred, and what is available. ! 87: */ ! 88: ! 89: #define DRIVER_BUSY 0x01 ! 90: #define DRIVER_SOFT 0x02 ! 91: #define DRIVER_MEDIA 0x03 ! 92: #define DRIVER_ERROR 0x04 ! 93: ! 94: #define DRIVER_INVALID 0x05 ! 95: #define DRIVER_TIMEOUT 0x06 ! 96: #define DRIVER_HARD 0x07 ! 97: #define DRIVER_SENSE 0x08 ! 98: ! 99: #define SUGGEST_RETRY 0x10 ! 100: #define SUGGEST_ABORT 0x20 ! 101: #define SUGGEST_REMAP 0x30 ! 102: #define SUGGEST_DIE 0x40 ! 103: #define SUGGEST_SENSE 0x80 ! 104: #define SUGGEST_IS_OK 0xff ! 105: ! 106: #define DRIVER_MASK 0x0f ! 107: #define SUGGEST_MASK 0xf0 ! 108: ! 109: #define MAX_COMMAND_SIZE 12 ! 110: ! 111: /* ! 112: * SCSI command sets ! 113: */ ! 114: ! 115: #define SCSI_UNKNOWN 0 ! 116: #define SCSI_1 1 ! 117: #define SCSI_1_CCS 2 ! 118: #define SCSI_2 3 ! 119: ! 120: /* ! 121: * Every SCSI command starts with a one byte OP-code. ! 122: * The next byte's high three bits are the LUN of the ! 123: * device. Any multi-byte quantities are stored high byte ! 124: * first, and may have a 5 bit MSB in the same byte ! 125: * as the LUN. ! 126: */ ! 127: ! 128: /* ! 129: * Manufacturers list ! 130: */ ! 131: ! 132: #define SCSI_MAN_UNKNOWN 0 ! 133: #define SCSI_MAN_NEC 1 ! 134: #define SCSI_MAN_TOSHIBA 2 ! 135: #define SCSI_MAN_NEC_OLDCDR 3 ! 136: #define SCSI_MAN_SONY 4 ! 137: #define SCSI_MAN_PIONEER 5 ! 138: ! 139: /* ! 140: * As the scsi do command functions are intelligent, and may need to ! 141: * redo a command, we need to keep track of the last command ! 142: * executed on each one. ! 143: */ ! 144: ! 145: #define WAS_RESET 0x01 ! 146: #define WAS_TIMEDOUT 0x02 ! 147: #define WAS_SENSE 0x04 ! 148: #define IS_RESETTING 0x08 ! 149: #define IS_ABORTING 0x10 ! 150: #define ASKED_FOR_SENSE 0x20 ! 151: ! 152: /* ! 153: * The scsi_device struct contains what we know about each given scsi ! 154: * device. ! 155: */ ! 156: ! 157: typedef struct scsi_device { ! 158: struct scsi_device * next; /* Used for linked list */ ! 159: ! 160: unsigned char id, lun, channel; ! 161: ! 162: unsigned int manufacturer; /* Manufacturer of device, for using ! 163: * vendor-specific cmd's */ ! 164: int attached; /* # of high level drivers attached to ! 165: * this */ ! 166: int access_count; /* Count of open channels/mounts */ ! 167: struct wait_queue * device_wait;/* Used to wait if device is busy */ ! 168: struct Scsi_Host * host; ! 169: void (*scsi_request_fn)(void); /* Used to jumpstart things after an ! 170: * ioctl */ ! 171: void *hostdata; /* available to low-level driver */ ! 172: char type; ! 173: char scsi_level; ! 174: char vendor[8], model[16], rev[4]; ! 175: unsigned char current_tag; /* current tag */ ! 176: unsigned char sync_min_period; /* Not less than this period */ ! 177: unsigned char sync_max_offset; /* Not greater than this offset */ ! 178: ! 179: unsigned writeable:1; ! 180: unsigned removable:1; ! 181: unsigned random:1; ! 182: unsigned has_cmdblocks:1; ! 183: unsigned changed:1; /* Data invalid due to media change */ ! 184: unsigned busy:1; /* Used to prevent races */ ! 185: unsigned lockable:1; /* Able to prevent media removal */ ! 186: unsigned borken:1; /* Tell the Seagate driver to be ! 187: * painfully slow on this device */ ! 188: unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */ ! 189: unsigned tagged_queue:1; /* SCSI-II tagged queuing enabled */ ! 190: unsigned disconnect:1; /* can disconnect */ ! 191: unsigned soft_reset:1; /* Uses soft reset option */ ! 192: unsigned sync:1; /* Negotiate for sync transfers */ ! 193: unsigned single_lun:1; /* Indicates we should only allow I/O to ! 194: one of the luns for the device at a time. */ ! 195: unsigned was_reset:1; /* There was a bus reset on the bus for this ! 196: device */ ! 197: unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN ! 198: because we did a bus reset. */ ! 199: } Scsi_Device; ! 200: ! 201: /* ! 202: * Use these to separate status msg and our bytes ! 203: */ ! 204: ! 205: #define status_byte(result) (((result) >> 1) & 0xf) ! 206: #define msg_byte(result) (((result) >> 8) & 0xff) ! 207: #define host_byte(result) (((result) >> 16) & 0xff) ! 208: #define driver_byte(result) (((result) >> 24) & 0xff) ! 209: #define suggestion(result) (driver_byte(result) & SUGGEST_MASK) ! 210: ! 211: #define sense_class(sense) (((sense) >> 4) & 0x7) ! 212: #define sense_error(sense) ((sense) & 0xf) ! 213: #define sense_valid(sense) ((sense) & 0x80); ! 214: ! 215: /* ! 216: * These are the SCSI devices available on the system. ! 217: */ ! 218: ! 219: extern Scsi_Device * scsi_devices; ! 220: ! 221: /* ! 222: * Initializes all SCSI devices. This scans all scsi busses. ! 223: */ ! 224: ! 225: extern int scsi_dev_init (void); ! 226: ! 227: struct scatterlist { ! 228: char * address; /* Location data is to be transferred to */ ! 229: char * alt_address; /* Location of actual if address is a ! 230: * dma indirect buffer. NULL otherwise */ ! 231: unsigned int length; ! 232: }; ! 233: ! 234: #ifdef __alpha__ ! 235: # define ISA_DMA_THRESHOLD (~0UL) ! 236: #else ! 237: # define ISA_DMA_THRESHOLD (0x00ffffff) ! 238: #endif ! 239: #define CONTIGUOUS_BUFFERS(X,Y) ((X->b_data+X->b_size) == Y->b_data) ! 240: ! 241: ! 242: /* ! 243: * These are the return codes for the abort and reset functions. The mid-level ! 244: * code uses these to decide what to do next. Each of the low level abort ! 245: * and reset functions must correctly indicate what it has done. ! 246: * The descriptions are written from the point of view of the mid-level code, ! 247: * so that the return code is telling the mid-level drivers exactly what ! 248: * the low level driver has already done, and what remains to be done. ! 249: */ ! 250: ! 251: /* We did not do anything. ! 252: * Wait some more for this command to complete, and if this does not work, ! 253: * try something more serious. */ ! 254: #define SCSI_ABORT_SNOOZE 0 ! 255: ! 256: /* This means that we were able to abort the command. We have already ! 257: * called the mid-level done function, and do not expect an interrupt that ! 258: * will lead to another call to the mid-level done function for this command */ ! 259: #define SCSI_ABORT_SUCCESS 1 ! 260: ! 261: /* We called for an abort of this command, and we should get an interrupt ! 262: * when this succeeds. Thus we should not restore the timer for this ! 263: * command in the mid-level abort function. */ ! 264: #define SCSI_ABORT_PENDING 2 ! 265: ! 266: /* Unable to abort - command is currently on the bus. Grin and bear it. */ ! 267: #define SCSI_ABORT_BUSY 3 ! 268: ! 269: /* The command is not active in the low level code. Command probably ! 270: * finished. */ ! 271: #define SCSI_ABORT_NOT_RUNNING 4 ! 272: ! 273: /* Something went wrong. The low level driver will indicate the correct ! 274: * error condition when it calls scsi_done, so the mid-level abort function ! 275: * can simply wait until this comes through */ ! 276: #define SCSI_ABORT_ERROR 5 ! 277: ! 278: /* We do not know how to reset the bus, or we do not want to. Bummer. ! 279: * Anyway, just wait a little more for the command in question, and hope that ! 280: * it eventually finishes. If it never finishes, the SCSI device could ! 281: * hang, so use this with caution. */ ! 282: #define SCSI_RESET_SNOOZE 0 ! 283: ! 284: /* We do not know how to reset the bus, or we do not want to. Bummer. ! 285: * We have given up on this ever completing. The mid-level code will ! 286: * request sense information to decide how to proceed from here. */ ! 287: #define SCSI_RESET_PUNT 1 ! 288: ! 289: /* This means that we were able to reset the bus. We have restarted all of ! 290: * the commands that should be restarted, and we should be able to continue ! 291: * on normally from here. We do not expect any interrupts that will return ! 292: * DID_RESET to any of the other commands in the host_queue, and the mid-level ! 293: * code does not need to do anything special to keep the commands alive. ! 294: * If a hard reset was performed then all outstanding commands on the ! 295: * bus have been restarted. */ ! 296: #define SCSI_RESET_SUCCESS 2 ! 297: ! 298: /* We called for a reset of this bus, and we should get an interrupt ! 299: * when this succeeds. Each command should get its own status ! 300: * passed up to scsi_done, but this has not happened yet. ! 301: * If a hard reset was performed, then we expect an interrupt ! 302: * for *each* of the outstanding commands that will have the ! 303: * effect of restarting the commands. ! 304: */ ! 305: #define SCSI_RESET_PENDING 3 ! 306: ! 307: /* We did a reset, but do not expect an interrupt to signal DID_RESET. ! 308: * This tells the upper level code to request the sense info, and this ! 309: * should keep the command alive. */ ! 310: #define SCSI_RESET_WAKEUP 4 ! 311: ! 312: /* Something went wrong, and we do not know how to fix it. */ ! 313: #define SCSI_RESET_ERROR 5 ! 314: ! 315: /* ! 316: * This is a bitmask that is ored with one of the above codes. ! 317: * It tells the mid-level code that we did a hard reset. ! 318: */ ! 319: #define SCSI_RESET_BUS_RESET 0x100 ! 320: /* ! 321: * Used to mask off bits and to obtain the basic action that was ! 322: * performed. ! 323: */ ! 324: #define SCSI_RESET_ACTION 0xff ! 325: ! 326: void * scsi_malloc(unsigned int); ! 327: int scsi_free(void *, unsigned int); ! 328: extern unsigned int dma_free_sectors; /* How much room do we have left */ ! 329: extern unsigned int need_isa_buffer; /* True if some devices need indirection ! 330: * buffers */ ! 331: ! 332: /* ! 333: * The Scsi_Cmnd structure is used by scsi.c internally, and for communication ! 334: * with low level drivers that support multiple outstanding commands. ! 335: */ ! 336: typedef struct scsi_pointer { ! 337: char * ptr; /* data pointer */ ! 338: int this_residual; /* left in this buffer */ ! 339: struct scatterlist *buffer; /* which buffer */ ! 340: int buffers_residual; /* how many buffers left */ ! 341: ! 342: volatile int Status; ! 343: volatile int Message; ! 344: volatile int have_data_in; ! 345: volatile int sent_command; ! 346: volatile int phase; ! 347: } Scsi_Pointer; ! 348: ! 349: typedef struct scsi_cmnd { ! 350: struct Scsi_Host * host; ! 351: Scsi_Device * device; ! 352: unsigned char target, lun, channel; ! 353: unsigned char cmd_len; ! 354: unsigned char old_cmd_len; ! 355: struct scsi_cmnd *next, *prev; ! 356: ! 357: /* These elements define the operation we are about to perform */ ! 358: unsigned char cmnd[12]; ! 359: unsigned request_bufflen; /* Actual request size */ ! 360: ! 361: void * request_buffer; /* Actual requested buffer */ ! 362: ! 363: /* These elements define the operation we ultimately want to perform */ ! 364: unsigned char data_cmnd[12]; ! 365: unsigned short old_use_sg; /* We save use_sg here when requesting ! 366: * sense info */ ! 367: unsigned short use_sg; /* Number of pieces of scatter-gather */ ! 368: unsigned short sglist_len; /* size of malloc'd scatter-gather list */ ! 369: unsigned short abort_reason;/* If the mid-level code requests an ! 370: * abort, this is the reason. */ ! 371: unsigned bufflen; /* Size of data buffer */ ! 372: void *buffer; /* Data buffer */ ! 373: ! 374: unsigned underflow; /* Return error if less than this amount is ! 375: * transfered */ ! 376: ! 377: unsigned transfersize; /* How much we are guaranteed to transfer with ! 378: * each SCSI transfer (ie, between disconnect / ! 379: * reconnects. Probably == sector size */ ! 380: ! 381: ! 382: struct request request; /* A copy of the command we are working on */ ! 383: ! 384: unsigned char sense_buffer[16]; /* Sense for this command, if needed */ ! 385: ! 386: ! 387: int retries; ! 388: int allowed; ! 389: int timeout_per_command, timeout_total, timeout; ! 390: ! 391: /* ! 392: * We handle the timeout differently if it happens when a reset, ! 393: * abort, etc are in process. ! 394: */ ! 395: unsigned volatile char internal_timeout; ! 396: ! 397: unsigned flags; ! 398: ! 399: /* These variables are for the cdrom only. Once we have variable size ! 400: * buffers in the buffer cache, they will go away. */ ! 401: int this_count; ! 402: /* End of special cdrom variables */ ! 403: ! 404: /* Low-level done function - can be used by low-level driver to point ! 405: * to completion function. Not used by mid/upper level code. */ ! 406: void (*scsi_done)(struct scsi_cmnd *); ! 407: void (*done)(struct scsi_cmnd *); /* Mid-level done function */ ! 408: ! 409: /* ! 410: * The following fields can be written to by the host specific code. ! 411: * Everything else should be left alone. ! 412: */ ! 413: ! 414: Scsi_Pointer SCp; /* Scratchpad used by some host adapters */ ! 415: ! 416: unsigned char * host_scribble; /* The host adapter is allowed to ! 417: * call scsi_malloc and get some memory ! 418: * and hang it here. The host adapter ! 419: * is also expected to call scsi_free ! 420: * to release this memory. (The memory ! 421: * obtained by scsi_malloc is guaranteed ! 422: * to be at an address < 16Mb). */ ! 423: ! 424: int result; /* Status code from lower level driver */ ! 425: ! 426: unsigned char tag; /* SCSI-II queued command tag */ ! 427: unsigned long pid; /* Process ID, starts at 0 */ ! 428: } Scsi_Cmnd; ! 429: ! 430: /* ! 431: * scsi_abort aborts the current command that is executing on host host. ! 432: * The error code, if non zero is returned in the host byte, otherwise ! 433: * DID_ABORT is returned in the hostbyte. ! 434: */ ! 435: ! 436: extern int scsi_abort (Scsi_Cmnd *, int code, int pid); ! 437: ! 438: extern void scsi_do_cmd (Scsi_Cmnd *, const void *cmnd , ! 439: void *buffer, unsigned bufflen, ! 440: void (*done)(struct scsi_cmnd *), ! 441: int timeout, int retries); ! 442: ! 443: ! 444: extern Scsi_Cmnd * allocate_device(struct request **, Scsi_Device *, int); ! 445: ! 446: extern Scsi_Cmnd * request_queueable(struct request *, Scsi_Device *); ! 447: extern int scsi_reset (Scsi_Cmnd *, int); ! 448: ! 449: extern int max_scsi_hosts; ! 450: ! 451: extern void proc_print_scsidevice(Scsi_Device *, char *, int *, int); ! 452: ! 453: extern void print_command(unsigned char *); ! 454: extern void print_sense(const char *, Scsi_Cmnd *); ! 455: extern void print_driverbyte(int scsiresult); ! 456: extern void print_hostbyte(int scsiresult); ! 457: ! 458: extern void scsi_mark_host_bus_reset(struct Scsi_Host *Host); ! 459: ! 460: #if defined(MAJOR_NR) && (MAJOR_NR != SCSI_TAPE_MAJOR) ! 461: #include "hosts.h" ! 462: ! 463: static Scsi_Cmnd * end_scsi_request(Scsi_Cmnd * SCpnt, int uptodate, int sectors) ! 464: { ! 465: struct request * req; ! 466: struct buffer_head * bh; ! 467: ! 468: req = &SCpnt->request; ! 469: if (!uptodate) { ! 470: printk(DEVICE_NAME " I/O error: dev %s, sector %lu\n", ! 471: kdevname(req->rq_dev), req->sector); ! 472: #ifdef MACH ! 473: req->errors = 1; ! 474: while (req->bh) { ! 475: bh = req->bh; ! 476: req->bh = bh->b_reqnext; ! 477: mark_buffer_uptodate(bh, 0); ! 478: unlock_buffer(bh); ! 479: } ! 480: goto done; ! 481: #endif ! 482: } ! 483: ! 484: do { ! 485: if ((bh = req->bh) != NULL) { ! 486: req->bh = bh->b_reqnext; ! 487: req->nr_sectors -= bh->b_size >> 9; ! 488: req->sector += bh->b_size >> 9; ! 489: bh->b_reqnext = NULL; ! 490: mark_buffer_uptodate(bh, uptodate); ! 491: unlock_buffer(bh); ! 492: sectors -= bh->b_size >> 9; ! 493: if ((bh = req->bh) != NULL) { ! 494: req->current_nr_sectors = bh->b_size >> 9; ! 495: if (req->nr_sectors < req->current_nr_sectors) { ! 496: req->nr_sectors = req->current_nr_sectors; ! 497: printk("end_scsi_request: buffer-list destroyed\n"); ! 498: } ! 499: } ! 500: } ! 501: } while(sectors && bh); ! 502: if (req->bh){ ! 503: req->buffer = bh->b_data; ! 504: return SCpnt; ! 505: }; ! 506: #ifdef MACH ! 507: req->errors = 0; ! 508: ! 509: done: ! 510: #endif ! 511: DEVICE_OFF(req->rq_dev); ! 512: if (req->sem != NULL) { ! 513: up(req->sem); ! 514: } ! 515: ! 516: if (SCpnt->host->block) { ! 517: struct Scsi_Host * next; ! 518: ! 519: for (next = SCpnt->host->block; next != SCpnt->host; ! 520: next = next->block) ! 521: wake_up(&next->host_wait); ! 522: } ! 523: ! 524: req->rq_status = RQ_INACTIVE; ! 525: #ifndef MACH ! 526: wake_up(&wait_for_request); ! 527: #endif ! 528: wake_up(&SCpnt->device->device_wait); ! 529: #ifdef MACH ! 530: { ! 531: unsigned long flags; ! 532: ! 533: save_flags(flags); ! 534: cli(); ! 535: (*blk_dev[MAJOR(req->rq_dev)].request_fn)(); ! 536: restore_flags(flags); ! 537: } ! 538: #endif ! 539: return NULL; ! 540: } ! 541: ! 542: ! 543: /* This is just like INIT_REQUEST, but we need to be aware of the fact ! 544: * that an interrupt may start another request, so we run this with interrupts ! 545: * turned off ! 546: */ ! 547: #define INIT_SCSI_REQUEST \ ! 548: if (!CURRENT) { \ ! 549: CLEAR_INTR; \ ! 550: restore_flags(flags); \ ! 551: return; \ ! 552: } \ ! 553: if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \ ! 554: panic(DEVICE_NAME ": request list destroyed");\ ! 555: if (CURRENT->bh) { \ ! 556: if (!buffer_locked(CURRENT->bh)) \ ! 557: panic(DEVICE_NAME ": block not locked"); \ ! 558: } ! 559: #endif ! 560: ! 561: #ifdef MACH ! 562: #define SCSI_SLEEP(QUEUE, CONDITION) { \ ! 563: if (CONDITION) { \ ! 564: struct wait_queue wait = { NULL, NULL}; \ ! 565: add_wait_queue(QUEUE, &wait); \ ! 566: for(;;) { \ ! 567: if (CONDITION) { \ ! 568: if (intr_count) \ ! 569: panic("scsi: trying to call schedule() in interrupt" \ ! 570: ", file %s, line %d.\n", __FILE__, __LINE__); \ ! 571: schedule(); \ ! 572: } \ ! 573: else \ ! 574: break; \ ! 575: } \ ! 576: remove_wait_queue(QUEUE, &wait);\ ! 577: }; } ! 578: #else /* ! MACH */ ! 579: #define SCSI_SLEEP(QUEUE, CONDITION) { \ ! 580: if (CONDITION) { \ ! 581: struct wait_queue wait = { current, NULL}; \ ! 582: add_wait_queue(QUEUE, &wait); \ ! 583: for(;;) { \ ! 584: current->state = TASK_UNINTERRUPTIBLE; \ ! 585: if (CONDITION) { \ ! 586: if (intr_count) \ ! 587: panic("scsi: trying to call schedule() in interrupt" \ ! 588: ", file %s, line %d.\n", __FILE__, __LINE__); \ ! 589: schedule(); \ ! 590: } \ ! 591: else \ ! 592: break; \ ! 593: } \ ! 594: remove_wait_queue(QUEUE, &wait);\ ! 595: current->state = TASK_RUNNING; \ ! 596: }; } ! 597: #endif /* ! MACH */ ! 598: ! 599: #endif ! 600: ! 601: /* ! 602: * Overrides for Emacs so that we follow Linus's tabbing style. ! 603: * Emacs will notice this stuff at the end of the file and automatically ! 604: * adjust the settings for this buffer only. This must remain at the end ! 605: * of the file. ! 606: * --------------------------------------------------------------------------- ! 607: * Local variables: ! 608: * c-indent-level: 4 ! 609: * c-brace-imaginary-offset: 0 ! 610: * c-brace-offset: -4 ! 611: * c-argdecl-indent: 4 ! 612: * c-label-offset: -4 ! 613: * c-continued-statement-offset: 4 ! 614: * c-continued-brace-offset: 0 ! 615: * indent-tabs-mode: nil ! 616: * tab-width: 8 ! 617: * End: ! 618: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.