1 /*
2 * scsi.h Copyright (C) 1992 Drew Eckhardt
3 * generic SCSI package header file by
4 * Drew Eckhardt
5 *
6 * <drew@colorado.edu>
7 *
8 * Modified by Eric Youngdale eric@tantalus.nrl.navy.mil to
9 * add scatter-gather, multiple outstanding request, and other
10 * enhancements.
11 */
12
13 #ifndef _SCSI_H
14 #define _SCSI_H
15
16 /*
17 $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/scsi.h,v 1.3 1993/09/24 12:20:33 drew Exp $
18
19 For documentation on the OPCODES, MESSAGES, and SENSE values,
20 please consult the SCSI standard.
21
22 */
23
24 /*
25 * SCSI opcodes
26 */
27
28 #define TEST_UNIT_READY 0x00
29 #define REZERO_UNIT 0x01
30 #define REQUEST_SENSE 0x03
31 #define FORMAT_UNIT 0x04
32 #define READ_BLOCK_LIMITS 0x05
33 #define REASSIGN_BLOCKS 0x07
34 #define READ_6 0x08
35 #define WRITE_6 0x0a
36 #define SEEK_6 0x0b
37 #define READ_REVERSE 0x0f
38 #define WRITE_FILEMARKS 0x10
39 #define SPACE 0x11
40 #define INQUIRY 0x12
41 #define RECOVER_BUFFERED_DATA 0x14
42 #define MODE_SELECT 0x15
43 #define RESERVE 0x16
44 #define RELEASE 0x17
45 #define COPY 0x18
46 #define ERASE 0x19
47 #define MODE_SENSE 0x1a
48 #define START_STOP 0x1b
49 #define RECEIVE_DIAGNOSTIC 0x1c
50 #define SEND_DIAGNOSTIC 0x1d
51 #define ALLOW_MEDIUM_REMOVAL 0x1e
52
53 #define SET_WINDOW 0x24
54 #define READ_CAPACITY 0x25
55 #define READ_10 0x28
56 #define WRITE_10 0x2a
57 #define SEEK_10 0x2b
58 #define WRITE_VERIFY 0x2e
59 #define VERIFY 0x2f
60 #define SEARCH_HIGH 0x30
61 #define SEARCH_EQUAL 0x31
62 #define SEARCH_LOW 0x32
63 #define SET_LIMITS 0x33
64 #define PRE_FETCH 0x34
65 #define READ_POSITION 0x34
66 #define SYNCHRONIZE_CACHE 0x35
67 #define LOCK_UNLOCK_CACHE 0x36
68 #define READ_DEFECT_DATA 0x37
69 #define MEDIUM_SCAN 0x38
70 #define COMPARE 0x39
71 #define COPY_VERIFY 0x3a
72 #define WRITE_BUFFER 0x3b
73 #define READ_BUFFER 0x3c
74 #define UPDATE_BLOCK 0x3d
75 #define READ_LONG 0x3e
76 #define WRITE_LONG 0x3f
77 #define CHANGE_DEFINITION 0x40
78 #define WRITE_SAME 0x41
79 #define LOG_SELECT 0x4c
80 #define LOG_SENSE 0x4d
81 #define MODE_SELECT_10 0x55
82 #define MODE_SENSE_10 0x5a
83 #define READ_12 0xa8
84 #define WRITE_12 0xaa
85 #define WRITE_VERIFY_12 0xae
86 #define SEARCH_HIGH_12 0xb0
87 #define SEARCH_EQUAL_12 0xb1
88 #define SEARCH_LOW_12 0xb2
89 #define SEND_VOLUME_TAG 0xb6
90 #define WRITE_LONG_2 0xea
91
92 extern void scsi_make_blocked_list(void);
93 extern volatile int in_scan_scsis;
94 extern const unsigned char scsi_command_size[8];
95 #define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
96
97 /*
98 * MESSAGE CODES
99 */
100
101 #define COMMAND_COMPLETE 0x00
102 #define EXTENDED_MESSAGE 0x01
103 #define EXTENDED_MODIFY_DATA_POINTER 0x00
104 #define EXTENDED_SDTR 0x01
105 #define EXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */
106 #define EXTENDED_WDTR 0x03
107 #define SAVE_POINTERS 0x02
108 #define RESTORE_POINTERS 0x03
109 #define DISCONNECT 0x04
110 #define INITIATOR_ERROR 0x05
111 #define ABORT 0x06
112 #define MESSAGE_REJECT 0x07
113 #define NOP 0x08
114 #define MSG_PARITY_ERROR 0x09
115 #define LINKED_CMD_COMPLETE 0x0a
116 #define LINKED_FLG_CMD_COMPLETE 0x0b
117 #define BUS_DEVICE_RESET 0x0c
118
119 #define INITIATE_RECOVERY 0x0f /* SCSI-II only */
120 #define RELEASE_RECOVERY 0x10 /* SCSI-II only */
121
122 #define SIMPLE_QUEUE_TAG 0x20
123 #define HEAD_OF_QUEUE_TAG 0x21
124 #define ORDERED_QUEUE_TAG 0x22
125
126 #define IDENTIFY_BASE 0x80
127 #define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
128 ((can_disconnect) ? 0x40 : 0) |\
129 ((lun) & 0x07))
130
131
132 /*
133 * Status codes
134 */
135
136 #define GOOD 0x00
137 #define CHECK_CONDITION 0x01
138 #define CONDITION_GOOD 0x02
139 #define BUSY 0x04
140 #define INTERMEDIATE_GOOD 0x08
141 #define INTERMEDIATE_C_GOOD 0x0a
142 #define RESERVATION_CONFLICT 0x0c
143 #define QUEUE_FULL 0x1a
144
145 #define STATUS_MASK 0x1e
146
147 /*
148 * the return of the status word will be in the following format :
149 * The low byte is the status returned by the SCSI command,
150 * with vendor specific bits masked.
151 *
152 * The next byte is the message which followed the SCSI status.
153 * This allows a stos to be used, since the Intel is a little
154 * endian machine.
155 *
156 * The final byte is a host return code, which is one of the following.
157 *
158 * IE
159 * lsb msb
160 * status msg host code
161 *
162 * Our errors returned by OUR driver, NOT SCSI message. Or'd with
163 * SCSI message passed back to driver <IF any>.
164 */
165
166
167 #define DID_OK 0x00 /* NO error */
168 #define DID_NO_CONNECT 0x01 /* Couldn't connect before timeout period */
169 #define DID_BUS_BUSY 0x02 /* BUS stayed busy through time out period */
170 #define DID_TIME_OUT 0x03 /* TIMED OUT for other reason */
171 #define DID_BAD_TARGET 0x04 /* BAD target. */
172 #define DID_ABORT 0x05 /* Told to abort for some other reason */
173 #define DID_PARITY 0x06 /* Parity error */
174 #define DID_ERROR 0x07 /* Internal error */
175 #define DID_RESET 0x08 /* Reset by somebody. */
176 #define DID_BAD_INTR 0x09 /* Got an interrupt we weren't expecting. */
177 #define DRIVER_OK 0x00 /* Driver status */
178
179 /*
180 * These indicate the error that occurred, and what is available.
181 */
182
183 #define DRIVER_BUSY 0x01
184 #define DRIVER_SOFT 0x02
185 #define DRIVER_MEDIA 0x03
186 #define DRIVER_ERROR 0x04
187
188 #define DRIVER_INVALID 0x05
189 #define DRIVER_TIMEOUT 0x06
190 #define DRIVER_HARD 0x07
191
192 #define SUGGEST_RETRY 0x10
193 #define SUGGEST_ABORT 0x20
194 #define SUGGEST_REMAP 0x30
195 #define SUGGEST_DIE 0x40
196 #define SUGGEST_SENSE 0x80
197 #define SUGGEST_IS_OK 0xff
198
199 #define DRIVER_SENSE 0x08
200
201 #define DRIVER_MASK 0x0f
202 #define SUGGEST_MASK 0xf0
203
204 /*
205 * SENSE KEYS
206 */
207
208 #define NO_SENSE 0x00
209 #define RECOVERED_ERROR 0x01
210 #define NOT_READY 0x02
211 #define MEDIUM_ERROR 0x03
212 #define HARDWARE_ERROR 0x04
213 #define ILLEGAL_REQUEST 0x05
214 #define UNIT_ATTENTION 0x06
215 #define DATA_PROTECT 0x07
216 #define BLANK_CHECK 0x08
217 #define COPY_ABORTED 0x0a
218 #define ABORTED_COMMAND 0x0b
219 #define VOLUME_OVERFLOW 0x0d
220 #define MISCOMPARE 0x0e
221
222
223 /*
224 * DEVICE TYPES
225 */
226
227 #define TYPE_DISK 0x00
228 #define TYPE_TAPE 0x01
229 #define TYPE_PROCESSOR 0x03 /* HP scanners use this */
230 #define TYPE_WORM 0x04 /* Treated as ROM by our system */
231 #define TYPE_ROM 0x05
232 #define TYPE_SCANNER 0x06
233 #define TYPE_MOD 0x07 /* Magneto-optical disk -
234 * - treated as TYPE_DISK */
235 #define TYPE_NO_LUN 0x7f
236
237
238 #define MAX_COMMAND_SIZE 12
239
240 /*
241 * SCSI command sets
242 */
243
244 #define SCSI_UNKNOWN 0
245 #define SCSI_1 1
246 #define SCSI_1_CCS 2
247 #define SCSI_2 3
248
249 /*
250 * Every SCSI command starts with a one byte OP-code.
251 * The next byte's high three bits are the LUN of the
252 * device. Any multi-byte quantities are stored high byte
253 * first, and may have a 5 bit MSB in the same byte
254 * as the LUN.
255 */
256
257 /*
258 * Manufacturers list
259 */
260
261 #define SCSI_MAN_UNKNOWN 0
262 #define SCSI_MAN_NEC 1
263 #define SCSI_MAN_TOSHIBA 2
264 #define SCSI_MAN_NEC_OLDCDR 3
265 #define SCSI_MAN_SONY 4
266
267 /*
268 * As the scsi do command functions are intelligent, and may need to
269 * redo a command, we need to keep track of the last command
270 * executed on each one.
271 */
272
273 #define WAS_RESET 0x01
274 #define WAS_TIMEDOUT 0x02
275 #define WAS_SENSE 0x04
276 #define IS_RESETTING 0x08
277 #define IS_ABORTING 0x10
278 #define ASKED_FOR_SENSE 0x20
279
280 /*
281 * The scsi_device struct contains what we know about each given scsi
282 * device.
283 */
284
285 typedef struct scsi_device {
286 struct scsi_device * next; /* Used for linked list */
287
288 unsigned char id, lun, channel;
289
290 unsigned int manufacturer; /* Manufacturer of device, for using
291 * vendor-specific cmd's */
292 int attached; /* # of high level drivers attached to
293 * this */
294 int access_count; /* Count of open channels/mounts */
295 struct wait_queue * device_wait;/* Used to wait if device is busy */
296 struct Scsi_Host * host;
297 void (*scsi_request_fn)(void); /* Used to jumpstart things after an
298 * ioctl */
299 void *hostdata; /* available to low-level driver */
300 char type;
301 char scsi_level;
302 char vendor[8], model[16], rev[4];
303 unsigned writeable:1;
304 unsigned removable:1;
305 unsigned random:1;
306 unsigned has_cmdblocks:1;
307 unsigned changed:1; /* Data invalid due to media change */
308 unsigned busy:1; /* Used to prevent races */
309 unsigned lockable:1; /* Able to prevent media removal */
310 unsigned borken:1; /* Tell the Seagate driver to be
311 * painfully slow on this device */
312 unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */
313 unsigned tagged_queue:1; /* SCSI-II tagged queuing enabled */
314 unsigned disconnect:1; /* can disconnect */
315 unsigned soft_reset:1; /* Uses soft reset option */
316 unsigned sync:1; /* Negotiate for sync transfers */
317 unsigned single_lun:1; /* Indicates we should only allow I/O to
318 one of the luns for the device at a time. */
319 unsigned char current_tag; /* current tag */
320 unsigned char sync_min_period; /* Not less than this period */
321 unsigned char sync_max_offset; /* Not greater than this offset */
322 } Scsi_Device;
323
324 /*
325 * Use these to separate status msg and our bytes
326 */
327
328 #define status_byte(result) (((result) >> 1) & 0xf)
329 #define msg_byte(result) (((result) >> 8) & 0xff)
330 #define host_byte(result) (((result) >> 16) & 0xff)
331 #define driver_byte(result) (((result) >> 24) & 0xff)
332 #define suggestion(result) (driver_byte(result) & SUGGEST_MASK)
333
334 #define sense_class(sense) (((sense) >> 4) & 0x7)
335 #define sense_error(sense) ((sense) & 0xf)
336 #define sense_valid(sense) ((sense) & 0x80);
337
338 /*
339 * These are the SCSI devices available on the system.
340 */
341
342 extern Scsi_Device * scsi_devices;
343
344 /*
345 * Initializes all SCSI devices. This scans all scsi busses.
346 */
347
348 extern unsigned long scsi_dev_init (unsigned long, unsigned long);
349
350 struct scatterlist {
351 char * address; /* Location data is to be transferred to */
352 char * alt_address; /* Location of actual if address is a
353 * dma indirect buffer. NULL otherwise */
354 unsigned int length;
355 };
356
357 #ifdef __alpha__
358 # define ISA_DMA_THRESHOLD (~0UL)
359 #else
360 # define ISA_DMA_THRESHOLD (0x00ffffff)
361 #endif
362 #define CONTIGUOUS_BUFFERS(X,Y) ((X->b_data+X->b_size) == Y->b_data)
363
364
365 /*
366 * These are the return codes for the abort and reset functions. The mid-level
367 * code uses these to decide what to do next. Each of the low level abort
368 * and reset functions must correctly indicate what it has done.
369 */
370
371 /* We did not do anything.
372 * Wait some more for this command to complete, and if this does not work,
373 * try something more serious. */
374 #define SCSI_ABORT_SNOOZE 0
375
376 /* This means that we were able to abort the command. We have already
377 * called the mid-level done function, and do not expect an interrupt that
378 * will lead to another call to the mid-level done function for this command */
379 #define SCSI_ABORT_SUCCESS 1
380
381 /* We called for an abort of this command, and we should get an interrupt
382 * when this succeeds. Thus we should not restore the timer for this
383 * command in the mid-level abort function. */
384 #define SCSI_ABORT_PENDING 2
385
386 /* Unable to abort - command is currently on the bus. Grin and bear it. */
387 #define SCSI_ABORT_BUSY 3
388
389 /* The command is not active in the low level code. Command probably
390 * finished. */
391 #define SCSI_ABORT_NOT_RUNNING 4
392
393 /* Something went wrong. The low level driver will indicate the correct
394 * error condition when it calls scsi_done, so the mid-level abort function
395 * can simply wait until this comes through */
396 #define SCSI_ABORT_ERROR 5
397
398 /* We do not know how to reset the bus, or we do not want to. Bummer.
399 * Anyway, just wait a little more for the command in question, and hope that
400 * it eventually finishes. If it never finishes, the SCSI device could
401 * hang, so use this with caution. */
402 #define SCSI_RESET_SNOOZE 0
403
404 /* We do not know how to reset the bus, or we do not want to. Bummer.
405 * We have given up on this ever completing. The mid-level code will
406 * request sense information to decide how to proceed from here. */
407 #define SCSI_RESET_PUNT 1
408
409 /* This means that we were able to reset the bus. We have restarted all of
410 * the commands that should be restarted, and we should be able to continue
411 * on normally from here. We do not expect any interrupts that will return
412 * DID_RESET to any of the other commands in the host_queue, and the mid-level
413 * code does not need to do anything special to keep the commands alive. */
414 #define SCSI_RESET_SUCCESS 2
415
416 /* We called for a reset of this bus, and we should get an interrupt
417 * when this succeeds. Each command should get its own status
418 * passed up to scsi_done, but this has not happened yet. */
419 #define SCSI_RESET_PENDING 3
420
421 /* We did a reset, but do not expect an interrupt to signal DID_RESET.
422 * This tells the upper level code to request the sense info, and this
423 * should keep the command alive. */
424 #define SCSI_RESET_WAKEUP 4
425
426 /* Something went wrong, and we do not know how to fix it. */
427 #define SCSI_RESET_ERROR 5
428
429 void * scsi_malloc(unsigned int);
430 int scsi_free(void *, unsigned int);
431 extern unsigned int dma_free_sectors; /* How much room do we have left */
432 extern unsigned int need_isa_buffer; /* True if some devices need indirection
433 * buffers */
434
435 /*
436 * The Scsi_Cmnd structure is used by scsi.c internally, and for communication
437 * with low level drivers that support multiple outstanding commands.
438 */
439 typedef struct scsi_pointer {
440 char * ptr; /* data pointer */
441 int this_residual; /* left in this buffer */
442 struct scatterlist *buffer; /* which buffer */
443 int buffers_residual; /* how many buffers left */
444
445 volatile int Status;
446 volatile int Message;
447 volatile int have_data_in;
448 volatile int sent_command;
449 volatile int phase;
450 } Scsi_Pointer;
451
452 typedef struct scsi_cmnd {
453 struct Scsi_Host * host;
454 Scsi_Device * device;
455 unsigned char target, lun, channel;
456 unsigned char cmd_len;
457 unsigned char old_cmd_len;
458 struct scsi_cmnd *next, *prev;
459
460 /* These elements define the operation we are about to perform */
461 unsigned char cmnd[12];
462 unsigned request_bufflen; /* Actual request size */
463
464 void * request_buffer; /* Actual requested buffer */
465
466 /* These elements define the operation we ultimately want to perform */
467 unsigned char data_cmnd[12];
468 unsigned short old_use_sg; /* We save use_sg here when requesting
469 * sense info */
470 unsigned short use_sg; /* Number of pieces of scatter-gather */
471 unsigned short sglist_len; /* size of malloc'd scatter-gather list */
472 unsigned short abort_reason;/* If the mid-level code requests an
473 * abort, this is the reason. */
474 unsigned bufflen; /* Size of data buffer */
475 void *buffer; /* Data buffer */
476
477 unsigned underflow; /* Return error if less than this amount is
478 * transfered */
479
480 unsigned transfersize; /* How much we are guaranteed to transfer with
481 * each SCSI transfer (ie, between disconnect /
482 * reconnects. Probably == sector size */
483
484
485 struct request request; /* A copy of the command we are working on */
486
487 unsigned char sense_buffer[16]; /* Sense for this command, if needed */
488
489
490 int retries;
491 int allowed;
492 int timeout_per_command, timeout_total, timeout;
493
494 /*
495 * We handle the timeout differently if it happens when a reset,
496 * abort, etc are in process.
497 */
498 unsigned volatile char internal_timeout;
499
500 unsigned flags;
501
502 /* These variables are for the cdrom only. Once we have variable size
503 * buffers in the buffer cache, they will go away. */
504 int this_count;
505 /* End of special cdrom variables */
506
507 /* Low-level done function - can be used by low-level driver to point
508 * to completion function. Not used by mid/upper level code. */
509 void (*scsi_done)(struct scsi_cmnd *);
510 void (*done)(struct scsi_cmnd *); /* Mid-level done function */
511
512 /*
513 * The following fields can be written to by the host specific code.
514 * Everything else should be left alone.
515 */
516
517 Scsi_Pointer SCp; /* Scratchpad used by some host adapters */
518
519 unsigned char * host_scribble; /* The host adapter is allowed to
520 * call scsi_malloc and get some memory
521 * and hang it here. The host adapter
522 * is also expected to call scsi_free
523 * to release this memory. (The memory
524 * obtained by scsi_malloc is guaranteed
525 * to be at an address < 16Mb). */
526
527 int result; /* Status code from lower level driver */
528
529 unsigned char tag; /* SCSI-II queued command tag */
530 unsigned long pid; /* Process ID, starts at 0 */
531 } Scsi_Cmnd;
532
533 /*
534 * scsi_abort aborts the current command that is executing on host host.
535 * The error code, if non zero is returned in the host byte, otherwise
536 * DID_ABORT is returned in the hostbyte.
537 */
538
539 extern int scsi_abort (Scsi_Cmnd *, int code, int pid);
540
541 extern void scsi_do_cmd (Scsi_Cmnd *, const void *cmnd ,
542 void *buffer, unsigned bufflen,
543 void (*done)(struct scsi_cmnd *),
544 int timeout, int retries);
545
546
547 extern Scsi_Cmnd * allocate_device(struct request **, Scsi_Device *, int);
548
549 extern Scsi_Cmnd * request_queueable(struct request *, Scsi_Device *);
550 extern int scsi_reset (Scsi_Cmnd *);
551
552 extern int max_scsi_hosts;
553
554 extern void build_proc_dir_entries(void);
555
556 extern int kernel_scsi_ioctl (Scsi_Device *dev, int cmd, void *arg);
557 extern int scsi_ioctl (Scsi_Device *dev, int cmd, void *arg);
558 extern void print_command(unsigned char *);
559 extern void print_sense(char *, Scsi_Cmnd *);
560
561
562 #if defined(MAJOR_NR) && (MAJOR_NR != SCSI_TAPE_MAJOR)
563 #include "hosts.h"
564
565 static Scsi_Cmnd * end_scsi_request(Scsi_Cmnd * SCpnt, int uptodate, int sectors)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
566 {
567 struct request * req;
568 struct buffer_head * bh;
569
570 req = &SCpnt->request;
571 req->errors = 0;
572 if (!uptodate) {
573 printk(DEVICE_NAME " I/O error: dev %04x, sector %lu\n",
574 req->dev,req->sector);
575 }
576
577 do {
578 if ((bh = req->bh) != NULL) {
579 req->bh = bh->b_reqnext;
580 req->nr_sectors -= bh->b_size >> 9;
581 req->sector += bh->b_size >> 9;
582 bh->b_reqnext = NULL;
583 bh->b_uptodate = uptodate;
584 unlock_buffer(bh);
585 sectors -= bh->b_size >> 9;
586 if ((bh = req->bh) != NULL) {
587 req->current_nr_sectors = bh->b_size >> 9;
588 if (req->nr_sectors < req->current_nr_sectors) {
589 req->nr_sectors = req->current_nr_sectors;
590 printk("end_scsi_request: buffer-list destroyed\n");
591 }
592 }
593 }
594 } while(sectors && bh);
595 if (req->bh){
596 req->buffer = bh->b_data;
597 return SCpnt;
598 };
599 DEVICE_OFF(req->dev);
600 if (req->sem != NULL) {
601 up(req->sem);
602 }
603
604 if (SCpnt->host->block) {
605 struct Scsi_Host * next;
606
607 for (next = SCpnt->host->block; next != SCpnt->host;
608 next = next->block)
609 wake_up(&next->host_wait);
610 }
611
612 req->dev = -1;
613 wake_up(&wait_for_request);
614 wake_up(&SCpnt->device->device_wait);
615 return NULL;
616 }
617
618
619 /* This is just like INIT_REQUEST, but we need to be aware of the fact
620 * that an interrupt may start another request, so we run this with interrupts
621 * turned off
622 */
623 #define INIT_SCSI_REQUEST \
624 if (!CURRENT) {\
625 CLEAR_INTR; \
626 restore_flags(flags); \
627 return; \
628 } \
629 if (MAJOR(CURRENT->dev) != MAJOR_NR) \
630 panic(DEVICE_NAME ": request list destroyed"); \
631 if (CURRENT->bh) { \
632 if (!CURRENT->bh->b_lock) \
633 panic(DEVICE_NAME ": block not locked"); \
634 }
635 #endif
636
637 #define SCSI_SLEEP(QUEUE, CONDITION) { \
638 if (CONDITION) { \
639 struct wait_queue wait = { current, NULL}; \
640 add_wait_queue(QUEUE, &wait); \
641 for(;;) { \
642 current->state = TASK_UNINTERRUPTIBLE; \
643 if (CONDITION) { \
644 if (intr_count) \
645 panic("scsi: trying to call schedule() in interrupt" \
646 ", file %s, line %d.\n", __FILE__, __LINE__); \
647 schedule(); \
648 } \
649 else \
650 break; \
651 } \
652 remove_wait_queue(QUEUE, &wait); \
653 current->state = TASK_RUNNING; \
654 }; }
655
656 #endif
657
658 /*
659 * Overrides for Emacs so that we follow Linus's tabbing style.
660 * Emacs will notice this stuff at the end of the file and automatically
661 * adjust the settings for this buffer only. This must remain at the end
662 * of the file.
663 * ---------------------------------------------------------------------------
664 * Local variables:
665 * c-indent-level: 4
666 * c-brace-imaginary-offset: 0
667 * c-brace-offset: -4
668 * c-argdecl-indent: 4
669 * c-label-offset: -4
670 * c-continued-statement-offset: 4
671 * c-continued-brace-offset: 0
672 * indent-tabs-mode: nil
673 * tab-width: 8
674 * End:
675 */