OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [scsi/] [scsi.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.