hid-core.c: Adds all GTCO CalComp Digitizers and InterWrite School Products to blacklist
[linux-2.6] / drivers / scsi / st.c
1 /*
2    SCSI Tape Driver for Linux version 1.1 and newer. See the accompanying
3    file Documentation/scsi/st.txt for more information.
4
5    History:
6    Rewritten from Dwayne Forsyth's SCSI tape driver by Kai Makisara.
7    Contribution and ideas from several people including (in alphabetical
8    order) Klaus Ehrenfried, Eugene Exarevsky, Eric Lee Green, Wolfgang Denk,
9    Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
10    Michael Schaefer, J"org Weule, and Eric Youngdale.
11
12    Copyright 1992 - 2005 Kai Makisara
13    email Kai.Makisara@kolumbus.fi
14
15    Some small formal changes - aeb, 950809
16
17    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
18  */
19
20 static const char *verstr = "20050830";
21
22 #include <linux/module.h>
23
24 #include <linux/fs.h>
25 #include <linux/kernel.h>
26 #include <linux/sched.h>
27 #include <linux/mm.h>
28 #include <linux/init.h>
29 #include <linux/string.h>
30 #include <linux/errno.h>
31 #include <linux/mtio.h>
32 #include <linux/cdrom.h>
33 #include <linux/ioctl.h>
34 #include <linux/fcntl.h>
35 #include <linux/spinlock.h>
36 #include <linux/blkdev.h>
37 #include <linux/moduleparam.h>
38 #include <linux/cdev.h>
39 #include <linux/delay.h>
40 #include <linux/mutex.h>
41
42 #include <asm/uaccess.h>
43 #include <asm/dma.h>
44 #include <asm/system.h>
45
46 #include <scsi/scsi.h>
47 #include <scsi/scsi_dbg.h>
48 #include <scsi/scsi_device.h>
49 #include <scsi/scsi_driver.h>
50 #include <scsi/scsi_eh.h>
51 #include <scsi/scsi_host.h>
52 #include <scsi/scsi_ioctl.h>
53 #include <scsi/sg.h>
54
55
56 /* The driver prints some debugging information on the console if DEBUG
57    is defined and non-zero. */
58 #define DEBUG 0
59
60 #if DEBUG
61 /* The message level for the debug messages is currently set to KERN_NOTICE
62    so that people can easily see the messages. Later when the debugging messages
63    in the drivers are more widely classified, this may be changed to KERN_DEBUG. */
64 #define ST_DEB_MSG  KERN_NOTICE
65 #define DEB(a) a
66 #define DEBC(a) if (debugging) { a ; }
67 #else
68 #define DEB(a)
69 #define DEBC(a)
70 #endif
71
72 #define ST_KILOBYTE 1024
73
74 #include "st_options.h"
75 #include "st.h"
76
77 static int buffer_kbs;
78 static int max_sg_segs;
79 static int try_direct_io = TRY_DIRECT_IO;
80 static int try_rdio = 1;
81 static int try_wdio = 1;
82
83 static int st_dev_max;
84 static int st_nr_dev;
85
86 static struct class *st_sysfs_class;
87
88 MODULE_AUTHOR("Kai Makisara");
89 MODULE_DESCRIPTION("SCSI tape (st) driver");
90 MODULE_LICENSE("GPL");
91 MODULE_ALIAS_CHARDEV_MAJOR(SCSI_TAPE_MAJOR);
92
93 /* Set 'perm' (4th argument) to 0 to disable module_param's definition
94  * of sysfs parameters (which module_param doesn't yet support).
95  * Sysfs parameters defined explicitly later.
96  */
97 module_param_named(buffer_kbs, buffer_kbs, int, 0);
98 MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size for fixed block mode (KB; 32)");
99 module_param_named(max_sg_segs, max_sg_segs, int, 0);
100 MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");
101 module_param_named(try_direct_io, try_direct_io, int, 0);
102 MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)");
103
104 /* Extra parameters for testing */
105 module_param_named(try_rdio, try_rdio, int, 0);
106 MODULE_PARM_DESC(try_rdio, "Try direct read i/o when possible");
107 module_param_named(try_wdio, try_wdio, int, 0);
108 MODULE_PARM_DESC(try_wdio, "Try direct write i/o when possible");
109
110 #ifndef MODULE
111 static int write_threshold_kbs;  /* retained for compatibility */
112 static struct st_dev_parm {
113         char *name;
114         int *val;
115 } parms[] __initdata = {
116         {
117                 "buffer_kbs", &buffer_kbs
118         },
119         {       /* Retained for compatibility with 2.4 */
120                 "write_threshold_kbs", &write_threshold_kbs
121         },
122         {
123                 "max_sg_segs", NULL
124         },
125         {
126                 "try_direct_io", &try_direct_io
127         }
128 };
129 #endif
130
131 /* Restrict the number of modes so that names for all are assigned */
132 #if ST_NBR_MODES > 16
133 #error "Maximum number of modes is 16"
134 #endif
135 /* Bit reversed order to get same names for same minors with all
136    mode counts */
137 static const char *st_formats[] = {
138         "",  "r", "k", "s", "l", "t", "o", "u",
139         "m", "v", "p", "x", "a", "y", "q", "z"}; 
140
141 /* The default definitions have been moved to st_options.h */
142
143 #define ST_FIXED_BUFFER_SIZE (ST_FIXED_BUFFER_BLOCKS * ST_KILOBYTE)
144
145 /* The buffer size should fit into the 24 bits for length in the
146    6-byte SCSI read and write commands. */
147 #if ST_FIXED_BUFFER_SIZE >= (2 << 24 - 1)
148 #error "Buffer size should not exceed (2 << 24 - 1) bytes!"
149 #endif
150
151 static int debugging = DEBUG;
152
153 #define MAX_RETRIES 0
154 #define MAX_WRITE_RETRIES 0
155 #define MAX_READY_RETRIES 0
156 #define NO_TAPE  NOT_READY
157
158 #define ST_TIMEOUT (900 * HZ)
159 #define ST_LONG_TIMEOUT (14000 * HZ)
160
161 /* Remove mode bits and auto-rewind bit (7) */
162 #define TAPE_NR(x) ( ((iminor(x) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
163     (iminor(x) & ~(-1 << ST_MODE_SHIFT)) )
164 #define TAPE_MODE(x) ((iminor(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
165
166 /* Construct the minor number from the device (d), mode (m), and non-rewind (n) data */
167 #define TAPE_MINOR(d, m, n) (((d & ~(255 >> (ST_NBR_MODE_BITS + 1))) << (ST_NBR_MODE_BITS + 1)) | \
168   (d & (255 >> (ST_NBR_MODE_BITS + 1))) | (m << ST_MODE_SHIFT) | ((n != 0) << 7) )
169
170 /* Internal ioctl to set both density (uppermost 8 bits) and blocksize (lower
171    24 bits) */
172 #define SET_DENS_AND_BLK 0x10001
173
174 static DEFINE_RWLOCK(st_dev_arr_lock);
175
176 static int st_fixed_buffer_size = ST_FIXED_BUFFER_SIZE;
177 static int st_max_sg_segs = ST_MAX_SG;
178
179 static struct scsi_tape **scsi_tapes = NULL;
180
181 static int modes_defined;
182
183 static struct st_buffer *new_tape_buffer(int, int, int);
184 static int enlarge_buffer(struct st_buffer *, int, int);
185 static void normalize_buffer(struct st_buffer *);
186 static int append_to_buffer(const char __user *, struct st_buffer *, int);
187 static int from_buffer(struct st_buffer *, char __user *, int);
188 static void move_buffer_data(struct st_buffer *, int);
189 static void buf_to_sg(struct st_buffer *, unsigned int);
190
191 static int sgl_map_user_pages(struct scatterlist *, const unsigned int, 
192                               unsigned long, size_t, int);
193 static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int);
194
195 static int st_probe(struct device *);
196 static int st_remove(struct device *);
197
198 static void do_create_driverfs_files(void);
199 static void do_remove_driverfs_files(void);
200 static void do_create_class_files(struct scsi_tape *, int, int);
201
202 static struct scsi_driver st_template = {
203         .owner                  = THIS_MODULE,
204         .gendrv = {
205                 .name           = "st",
206                 .probe          = st_probe,
207                 .remove         = st_remove,
208         },
209 };
210
211 static int st_compression(struct scsi_tape *, int);
212
213 static int find_partition(struct scsi_tape *);
214 static int switch_partition(struct scsi_tape *);
215
216 static int st_int_ioctl(struct scsi_tape *, unsigned int, unsigned long);
217
218 static void scsi_tape_release(struct kref *);
219
220 #define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref)
221
222 static DEFINE_MUTEX(st_ref_mutex);
223
224 \f
225 #include "osst_detect.h"
226 #ifndef SIGS_FROM_OSST
227 #define SIGS_FROM_OSST \
228         {"OnStream", "SC-", "", "osst"}, \
229         {"OnStream", "DI-", "", "osst"}, \
230         {"OnStream", "DP-", "", "osst"}, \
231         {"OnStream", "USB", "", "osst"}, \
232         {"OnStream", "FW-", "", "osst"}
233 #endif
234
235 static struct scsi_tape *scsi_tape_get(int dev)
236 {
237         struct scsi_tape *STp = NULL;
238
239         mutex_lock(&st_ref_mutex);
240         write_lock(&st_dev_arr_lock);
241
242         if (dev < st_dev_max && scsi_tapes != NULL)
243                 STp = scsi_tapes[dev];
244         if (!STp) goto out;
245
246         kref_get(&STp->kref);
247
248         if (!STp->device)
249                 goto out_put;
250
251         if (scsi_device_get(STp->device))
252                 goto out_put;
253
254         goto out;
255
256 out_put:
257         kref_put(&STp->kref, scsi_tape_release);
258         STp = NULL;
259 out:
260         write_unlock(&st_dev_arr_lock);
261         mutex_unlock(&st_ref_mutex);
262         return STp;
263 }
264
265 static void scsi_tape_put(struct scsi_tape *STp)
266 {
267         struct scsi_device *sdev = STp->device;
268
269         mutex_lock(&st_ref_mutex);
270         kref_put(&STp->kref, scsi_tape_release);
271         scsi_device_put(sdev);
272         mutex_unlock(&st_ref_mutex);
273 }
274
275 struct st_reject_data {
276         char *vendor;
277         char *model;
278         char *rev;
279         char *driver_hint; /* Name of the correct driver, NULL if unknown */
280 };
281
282 static struct st_reject_data reject_list[] = {
283         /* {"XXX", "Yy-", "", NULL},  example */
284         SIGS_FROM_OSST,
285         {NULL, }};
286
287 /* If the device signature is on the list of incompatible drives, the
288    function returns a pointer to the name of the correct driver (if known) */
289 static char * st_incompatible(struct scsi_device* SDp)
290 {
291         struct st_reject_data *rp;
292
293         for (rp=&(reject_list[0]); rp->vendor != NULL; rp++)
294                 if (!strncmp(rp->vendor, SDp->vendor, strlen(rp->vendor)) &&
295                     !strncmp(rp->model, SDp->model, strlen(rp->model)) &&
296                     !strncmp(rp->rev, SDp->rev, strlen(rp->rev))) {
297                         if (rp->driver_hint)
298                                 return rp->driver_hint;
299                         else
300                                 return "unknown";
301                 }
302         return NULL;
303 }
304 \f
305
306 static inline char *tape_name(struct scsi_tape *tape)
307 {
308         return tape->disk->disk_name;
309 }
310
311
312 static void st_analyze_sense(struct st_request *SRpnt, struct st_cmdstatus *s)
313 {
314         const u8 *ucp;
315         const u8 *sense = SRpnt->sense;
316
317         s->have_sense = scsi_normalize_sense(SRpnt->sense,
318                                 SCSI_SENSE_BUFFERSIZE, &s->sense_hdr);
319         s->flags = 0;
320
321         if (s->have_sense) {
322                 s->deferred = 0;
323                 s->remainder_valid =
324                         scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64);
325                 switch (sense[0] & 0x7f) {
326                 case 0x71:
327                         s->deferred = 1;
328                 case 0x70:
329                         s->fixed_format = 1;
330                         s->flags = sense[2] & 0xe0;
331                         break;
332                 case 0x73:
333                         s->deferred = 1;
334                 case 0x72:
335                         s->fixed_format = 0;
336                         ucp = scsi_sense_desc_find(sense, SCSI_SENSE_BUFFERSIZE, 4);
337                         s->flags = ucp ? (ucp[3] & 0xe0) : 0;
338                         break;
339                 }
340         }
341 }
342
343
344 /* Convert the result to success code */
345 static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
346 {
347         int result = SRpnt->result;
348         u8 scode;
349         DEB(const char *stp;)
350         char *name = tape_name(STp);
351         struct st_cmdstatus *cmdstatp;
352
353         if (!result)
354                 return 0;
355
356         cmdstatp = &STp->buffer->cmdstat;
357         st_analyze_sense(SRpnt, cmdstatp);
358
359         if (cmdstatp->have_sense)
360                 scode = STp->buffer->cmdstat.sense_hdr.sense_key;
361         else
362                 scode = 0;
363
364         DEB(
365         if (debugging) {
366                 printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x\n",
367                        name, result,
368                        SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
369                        SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
370                 if (cmdstatp->have_sense)
371                          __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
372         } ) /* end DEB */
373         if (!debugging) { /* Abnormal conditions for tape */
374                 if (!cmdstatp->have_sense)
375                         printk(KERN_WARNING
376                                "%s: Error %x (sugg. bt 0x%x, driver bt 0x%x, host bt 0x%x).\n",
377                                name, result, suggestion(result),
378                                driver_byte(result) & DRIVER_MASK, host_byte(result));
379                 else if (cmdstatp->have_sense &&
380                          scode != NO_SENSE &&
381                          scode != RECOVERED_ERROR &&
382                          /* scode != UNIT_ATTENTION && */
383                          scode != BLANK_CHECK &&
384                          scode != VOLUME_OVERFLOW &&
385                          SRpnt->cmd[0] != MODE_SENSE &&
386                          SRpnt->cmd[0] != TEST_UNIT_READY) {
387
388                         __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
389                 }
390         }
391
392         if (cmdstatp->fixed_format &&
393             STp->cln_mode >= EXTENDED_SENSE_START) {  /* Only fixed format sense */
394                 if (STp->cln_sense_value)
395                         STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
396                                                STp->cln_sense_mask) == STp->cln_sense_value);
397                 else
398                         STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
399                                                STp->cln_sense_mask) != 0);
400         }
401         if (cmdstatp->have_sense &&
402             cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17)
403                 STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */
404
405         STp->pos_unknown |= STp->device->was_reset;
406
407         if (cmdstatp->have_sense &&
408             scode == RECOVERED_ERROR
409 #if ST_RECOVERED_WRITE_FATAL
410             && SRpnt->cmd[0] != WRITE_6
411             && SRpnt->cmd[0] != WRITE_FILEMARKS
412 #endif
413             ) {
414                 STp->recover_count++;
415                 STp->recover_reg++;
416
417                 DEB(
418                 if (debugging) {
419                         if (SRpnt->cmd[0] == READ_6)
420                                 stp = "read";
421                         else if (SRpnt->cmd[0] == WRITE_6)
422                                 stp = "write";
423                         else
424                                 stp = "ioctl";
425                         printk(ST_DEB_MSG "%s: Recovered %s error (%d).\n", name, stp,
426                                STp->recover_count);
427                 } ) /* end DEB */
428
429                 if (cmdstatp->flags == 0)
430                         return 0;
431         }
432         return (-EIO);
433 }
434
435
436 /* Wakeup from interrupt */
437 static void st_sleep_done(void *data, char *sense, int result, int resid)
438 {
439         struct st_request *SRpnt = data;
440         struct scsi_tape *STp = SRpnt->stp;
441
442         memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE);
443         (STp->buffer)->cmdstat.midlevel_result = SRpnt->result = result;
444         DEB( STp->write_pending = 0; )
445
446         if (SRpnt->waiting)
447                 complete(SRpnt->waiting);
448 }
449
450 static struct st_request *st_allocate_request(void)
451 {
452         return kzalloc(sizeof(struct st_request), GFP_KERNEL);
453 }
454
455 static void st_release_request(struct st_request *streq)
456 {
457         kfree(streq);
458 }
459
460 /* Do the scsi command. Waits until command performed if do_wait is true.
461    Otherwise write_behind_check() is used to check that the command
462    has finished. */
463 static struct st_request *
464 st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd,
465            int bytes, int direction, int timeout, int retries, int do_wait)
466 {
467         struct completion *waiting;
468
469         /* if async, make sure there's no command outstanding */
470         if (!do_wait && ((STp->buffer)->last_SRpnt)) {
471                 printk(KERN_ERR "%s: Async command already active.\n",
472                        tape_name(STp));
473                 if (signal_pending(current))
474                         (STp->buffer)->syscall_result = (-EINTR);
475                 else
476                         (STp->buffer)->syscall_result = (-EBUSY);
477                 return NULL;
478         }
479
480         if (SRpnt == NULL) {
481                 SRpnt = st_allocate_request();
482                 if (SRpnt == NULL) {
483                         DEBC( printk(KERN_ERR "%s: Can't get SCSI request.\n",
484                                      tape_name(STp)); );
485                         if (signal_pending(current))
486                                 (STp->buffer)->syscall_result = (-EINTR);
487                         else
488                                 (STp->buffer)->syscall_result = (-EBUSY);
489                         return NULL;
490                 }
491                 SRpnt->stp = STp;
492         }
493
494         /* If async IO, set last_SRpnt. This ptr tells write_behind_check
495            which IO is outstanding. It's nulled out when the IO completes. */
496         if (!do_wait)
497                 (STp->buffer)->last_SRpnt = SRpnt;
498
499         waiting = &STp->wait;
500         init_completion(waiting);
501         SRpnt->waiting = waiting;
502
503         if (!STp->buffer->do_dio)
504                 buf_to_sg(STp->buffer, bytes);
505
506         memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd));
507         STp->buffer->cmdstat.have_sense = 0;
508         STp->buffer->syscall_result = 0;
509
510         if (scsi_execute_async(STp->device, cmd, COMMAND_SIZE(cmd[0]), direction,
511                         &((STp->buffer)->sg[0]), bytes, (STp->buffer)->sg_segs,
512                                timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) {
513                 /* could not allocate the buffer or request was too large */
514                 (STp->buffer)->syscall_result = (-EBUSY);
515                 (STp->buffer)->last_SRpnt = NULL;
516         }
517         else if (do_wait) {
518                 wait_for_completion(waiting);
519                 SRpnt->waiting = NULL;
520                 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
521         }
522
523         return SRpnt;
524 }
525
526
527 /* Handle the write-behind checking (waits for completion). Returns -ENOSPC if
528    write has been correct but EOM early warning reached, -EIO if write ended in
529    error or zero if write successful. Asynchronous writes are used only in
530    variable block mode. */
531 static int write_behind_check(struct scsi_tape * STp)
532 {
533         int retval = 0;
534         struct st_buffer *STbuffer;
535         struct st_partstat *STps;
536         struct st_cmdstatus *cmdstatp;
537         struct st_request *SRpnt;
538
539         STbuffer = STp->buffer;
540         if (!STbuffer->writing)
541                 return 0;
542
543         DEB(
544         if (STp->write_pending)
545                 STp->nbr_waits++;
546         else
547                 STp->nbr_finished++;
548         ) /* end DEB */
549
550         wait_for_completion(&(STp->wait));
551         SRpnt = STbuffer->last_SRpnt;
552         STbuffer->last_SRpnt = NULL;
553         SRpnt->waiting = NULL;
554
555         (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
556         st_release_request(SRpnt);
557
558         STbuffer->buffer_bytes -= STbuffer->writing;
559         STps = &(STp->ps[STp->partition]);
560         if (STps->drv_block >= 0) {
561                 if (STp->block_size == 0)
562                         STps->drv_block++;
563                 else
564                         STps->drv_block += STbuffer->writing / STp->block_size;
565         }
566
567         cmdstatp = &STbuffer->cmdstat;
568         if (STbuffer->syscall_result) {
569                 retval = -EIO;
570                 if (cmdstatp->have_sense && !cmdstatp->deferred &&
571                     (cmdstatp->flags & SENSE_EOM) &&
572                     (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
573                      cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR)) {
574                         /* EOM at write-behind, has all data been written? */
575                         if (!cmdstatp->remainder_valid ||
576                             cmdstatp->uremainder64 == 0)
577                                 retval = -ENOSPC;
578                 }
579                 if (retval == -EIO)
580                         STps->drv_block = -1;
581         }
582         STbuffer->writing = 0;
583
584         DEB(if (debugging && retval)
585             printk(ST_DEB_MSG "%s: Async write error %x, return value %d.\n",
586                    tape_name(STp), STbuffer->cmdstat.midlevel_result, retval);) /* end DEB */
587
588         return retval;
589 }
590
591
592 /* Step over EOF if it has been inadvertently crossed (ioctl not used because
593    it messes up the block number). */
594 static int cross_eof(struct scsi_tape * STp, int forward)
595 {
596         struct st_request *SRpnt;
597         unsigned char cmd[MAX_COMMAND_SIZE];
598
599         cmd[0] = SPACE;
600         cmd[1] = 0x01;          /* Space FileMarks */
601         if (forward) {
602                 cmd[2] = cmd[3] = 0;
603                 cmd[4] = 1;
604         } else
605                 cmd[2] = cmd[3] = cmd[4] = 0xff;        /* -1 filemarks */
606         cmd[5] = 0;
607
608         DEBC(printk(ST_DEB_MSG "%s: Stepping over filemark %s.\n",
609                    tape_name(STp), forward ? "forward" : "backward"));
610
611         SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
612                            STp->device->timeout, MAX_RETRIES, 1);
613         if (!SRpnt)
614                 return (STp->buffer)->syscall_result;
615
616         st_release_request(SRpnt);
617         SRpnt = NULL;
618
619         if ((STp->buffer)->cmdstat.midlevel_result != 0)
620                 printk(KERN_ERR "%s: Stepping over filemark %s failed.\n",
621                    tape_name(STp), forward ? "forward" : "backward");
622
623         return (STp->buffer)->syscall_result;
624 }
625
626
627 /* Flush the write buffer (never need to write if variable blocksize). */
628 static int flush_write_buffer(struct scsi_tape * STp)
629 {
630         int offset, transfer, blks;
631         int result;
632         unsigned char cmd[MAX_COMMAND_SIZE];
633         struct st_request *SRpnt;
634         struct st_partstat *STps;
635
636         result = write_behind_check(STp);
637         if (result)
638                 return result;
639
640         result = 0;
641         if (STp->dirty == 1) {
642
643                 offset = (STp->buffer)->buffer_bytes;
644                 transfer = ((offset + STp->block_size - 1) /
645                             STp->block_size) * STp->block_size;
646                 DEBC(printk(ST_DEB_MSG "%s: Flushing %d bytes.\n",
647                                tape_name(STp), transfer));
648
649                 memset((STp->buffer)->b_data + offset, 0, transfer - offset);
650
651                 memset(cmd, 0, MAX_COMMAND_SIZE);
652                 cmd[0] = WRITE_6;
653                 cmd[1] = 1;
654                 blks = transfer / STp->block_size;
655                 cmd[2] = blks >> 16;
656                 cmd[3] = blks >> 8;
657                 cmd[4] = blks;
658
659                 SRpnt = st_do_scsi(NULL, STp, cmd, transfer, DMA_TO_DEVICE,
660                                    STp->device->timeout, MAX_WRITE_RETRIES, 1);
661                 if (!SRpnt)
662                         return (STp->buffer)->syscall_result;
663
664                 STps = &(STp->ps[STp->partition]);
665                 if ((STp->buffer)->syscall_result != 0) {
666                         struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
667
668                         if (cmdstatp->have_sense && !cmdstatp->deferred &&
669                             (cmdstatp->flags & SENSE_EOM) &&
670                             (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
671                              cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
672                             (!cmdstatp->remainder_valid ||
673                              cmdstatp->uremainder64 == 0)) { /* All written at EOM early warning */
674                                 STp->dirty = 0;
675                                 (STp->buffer)->buffer_bytes = 0;
676                                 if (STps->drv_block >= 0)
677                                         STps->drv_block += blks;
678                                 result = (-ENOSPC);
679                         } else {
680                                 printk(KERN_ERR "%s: Error on flush.\n",
681                                        tape_name(STp));
682                                 STps->drv_block = (-1);
683                                 result = (-EIO);
684                         }
685                 } else {
686                         if (STps->drv_block >= 0)
687                                 STps->drv_block += blks;
688                         STp->dirty = 0;
689                         (STp->buffer)->buffer_bytes = 0;
690                 }
691                 st_release_request(SRpnt);
692                 SRpnt = NULL;
693         }
694         return result;
695 }
696
697
698 /* Flush the tape buffer. The tape will be positioned correctly unless
699    seek_next is true. */
700 static int flush_buffer(struct scsi_tape *STp, int seek_next)
701 {
702         int backspace, result;
703         struct st_buffer *STbuffer;
704         struct st_partstat *STps;
705
706         STbuffer = STp->buffer;
707
708         /*
709          * If there was a bus reset, block further access
710          * to this device.
711          */
712         if (STp->pos_unknown)
713                 return (-EIO);
714
715         if (STp->ready != ST_READY)
716                 return 0;
717         STps = &(STp->ps[STp->partition]);
718         if (STps->rw == ST_WRITING)     /* Writing */
719                 return flush_write_buffer(STp);
720
721         if (STp->block_size == 0)
722                 return 0;
723
724         backspace = ((STp->buffer)->buffer_bytes +
725                      (STp->buffer)->read_pointer) / STp->block_size -
726             ((STp->buffer)->read_pointer + STp->block_size - 1) /
727             STp->block_size;
728         (STp->buffer)->buffer_bytes = 0;
729         (STp->buffer)->read_pointer = 0;
730         result = 0;
731         if (!seek_next) {
732                 if (STps->eof == ST_FM_HIT) {
733                         result = cross_eof(STp, 0);     /* Back over the EOF hit */
734                         if (!result)
735                                 STps->eof = ST_NOEOF;
736                         else {
737                                 if (STps->drv_file >= 0)
738                                         STps->drv_file++;
739                                 STps->drv_block = 0;
740                         }
741                 }
742                 if (!result && backspace > 0)
743                         result = st_int_ioctl(STp, MTBSR, backspace);
744         } else if (STps->eof == ST_FM_HIT) {
745                 if (STps->drv_file >= 0)
746                         STps->drv_file++;
747                 STps->drv_block = 0;
748                 STps->eof = ST_NOEOF;
749         }
750         return result;
751
752 }
753 \f
754 /* Set the mode parameters */
755 static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm)
756 {
757         int set_it = 0;
758         unsigned long arg;
759         char *name = tape_name(STp);
760
761         if (!STp->density_changed &&
762             STm->default_density >= 0 &&
763             STm->default_density != STp->density) {
764                 arg = STm->default_density;
765                 set_it = 1;
766         } else
767                 arg = STp->density;
768         arg <<= MT_ST_DENSITY_SHIFT;
769         if (!STp->blksize_changed &&
770             STm->default_blksize >= 0 &&
771             STm->default_blksize != STp->block_size) {
772                 arg |= STm->default_blksize;
773                 set_it = 1;
774         } else
775                 arg |= STp->block_size;
776         if (set_it &&
777             st_int_ioctl(STp, SET_DENS_AND_BLK, arg)) {
778                 printk(KERN_WARNING
779                        "%s: Can't set default block size to %d bytes and density %x.\n",
780                        name, STm->default_blksize, STm->default_density);
781                 if (modes_defined)
782                         return (-EINVAL);
783         }
784         return 0;
785 }
786
787
788 /* Lock or unlock the drive door. Don't use when st_request allocated. */
789 static int do_door_lock(struct scsi_tape * STp, int do_lock)
790 {
791         int retval, cmd;
792         DEB(char *name = tape_name(STp);)
793
794
795         cmd = do_lock ? SCSI_IOCTL_DOORLOCK : SCSI_IOCTL_DOORUNLOCK;
796         DEBC(printk(ST_DEB_MSG "%s: %socking drive door.\n", name,
797                     do_lock ? "L" : "Unl"));
798         retval = scsi_ioctl(STp->device, cmd, NULL);
799         if (!retval) {
800                 STp->door_locked = do_lock ? ST_LOCKED_EXPLICIT : ST_UNLOCKED;
801         }
802         else {
803                 STp->door_locked = ST_LOCK_FAILS;
804         }
805         return retval;
806 }
807
808
809 /* Set the internal state after reset */
810 static void reset_state(struct scsi_tape *STp)
811 {
812         int i;
813         struct st_partstat *STps;
814
815         STp->pos_unknown = 0;
816         for (i = 0; i < ST_NBR_PARTITIONS; i++) {
817                 STps = &(STp->ps[i]);
818                 STps->rw = ST_IDLE;
819                 STps->eof = ST_NOEOF;
820                 STps->at_sm = 0;
821                 STps->last_block_valid = 0;
822                 STps->drv_block = -1;
823                 STps->drv_file = -1;
824         }
825         if (STp->can_partitions) {
826                 STp->partition = find_partition(STp);
827                 if (STp->partition < 0)
828                         STp->partition = 0;
829                 STp->new_partition = STp->partition;
830         }
831 }
832 \f
833 /* Test if the drive is ready. Returns either one of the codes below or a negative system
834    error code. */
835 #define CHKRES_READY       0
836 #define CHKRES_NEW_SESSION 1
837 #define CHKRES_NOT_READY   2
838 #define CHKRES_NO_TAPE     3
839
840 #define MAX_ATTENTIONS    10
841
842 static int test_ready(struct scsi_tape *STp, int do_wait)
843 {
844         int attentions, waits, max_wait, scode;
845         int retval = CHKRES_READY, new_session = 0;
846         unsigned char cmd[MAX_COMMAND_SIZE];
847         struct st_request *SRpnt = NULL;
848         struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
849
850         max_wait = do_wait ? ST_BLOCK_SECONDS : 0;
851
852         for (attentions=waits=0; ; ) {
853                 memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
854                 cmd[0] = TEST_UNIT_READY;
855                 SRpnt = st_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
856                                    STp->long_timeout, MAX_READY_RETRIES, 1);
857
858                 if (!SRpnt) {
859                         retval = (STp->buffer)->syscall_result;
860                         break;
861                 }
862
863                 if (cmdstatp->have_sense) {
864
865                         scode = cmdstatp->sense_hdr.sense_key;
866
867                         if (scode == UNIT_ATTENTION) { /* New media? */
868                                 new_session = 1;
869                                 if (attentions < MAX_ATTENTIONS) {
870                                         attentions++;
871                                         continue;
872                                 }
873                                 else {
874                                         retval = (-EIO);
875                                         break;
876                                 }
877                         }
878
879                         if (scode == NOT_READY) {
880                                 if (waits < max_wait) {
881                                         if (msleep_interruptible(1000)) {
882                                                 retval = (-EINTR);
883                                                 break;
884                                         }
885                                         waits++;
886                                         continue;
887                                 }
888                                 else {
889                                         if ((STp->device)->scsi_level >= SCSI_2 &&
890                                             cmdstatp->sense_hdr.asc == 0x3a)    /* Check ASC */
891                                                 retval = CHKRES_NO_TAPE;
892                                         else
893                                                 retval = CHKRES_NOT_READY;
894                                         break;
895                                 }
896                         }
897                 }
898
899                 retval = (STp->buffer)->syscall_result;
900                 if (!retval)
901                         retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
902                 break;
903         }
904
905         if (SRpnt != NULL)
906                 st_release_request(SRpnt);
907         return retval;
908 }
909
910
911 /* See if the drive is ready and gather information about the tape. Return values:
912    < 0   negative error code from errno.h
913    0     drive ready
914    1     drive not ready (possibly no tape)
915 */
916 static int check_tape(struct scsi_tape *STp, struct file *filp)
917 {
918         int i, retval, new_session = 0, do_wait;
919         unsigned char cmd[MAX_COMMAND_SIZE], saved_cleaning;
920         unsigned short st_flags = filp->f_flags;
921         struct st_request *SRpnt = NULL;
922         struct st_modedef *STm;
923         struct st_partstat *STps;
924         char *name = tape_name(STp);
925         struct inode *inode = filp->f_dentry->d_inode;
926         int mode = TAPE_MODE(inode);
927
928         STp->ready = ST_READY;
929
930         if (mode != STp->current_mode) {
931                 DEBC(printk(ST_DEB_MSG "%s: Mode change from %d to %d.\n",
932                                name, STp->current_mode, mode));
933                 new_session = 1;
934                 STp->current_mode = mode;
935         }
936         STm = &(STp->modes[STp->current_mode]);
937
938         saved_cleaning = STp->cleaning_req;
939         STp->cleaning_req = 0;
940
941         do_wait = ((filp->f_flags & O_NONBLOCK) == 0);
942         retval = test_ready(STp, do_wait);
943
944         if (retval < 0)
945             goto err_out;
946
947         if (retval == CHKRES_NEW_SESSION) {
948                 STp->pos_unknown = 0;
949                 STp->partition = STp->new_partition = 0;
950                 if (STp->can_partitions)
951                         STp->nbr_partitions = 1; /* This guess will be updated later
952                                                     if necessary */
953                 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
954                         STps = &(STp->ps[i]);
955                         STps->rw = ST_IDLE;
956                         STps->eof = ST_NOEOF;
957                         STps->at_sm = 0;
958                         STps->last_block_valid = 0;
959                         STps->drv_block = 0;
960                         STps->drv_file = 0;
961                 }
962                 new_session = 1;
963         }
964         else {
965                 STp->cleaning_req |= saved_cleaning;
966
967                 if (retval == CHKRES_NOT_READY || retval == CHKRES_NO_TAPE) {
968                         if (retval == CHKRES_NO_TAPE)
969                                 STp->ready = ST_NO_TAPE;
970                         else
971                                 STp->ready = ST_NOT_READY;
972
973                         STp->density = 0;       /* Clear the erroneous "residue" */
974                         STp->write_prot = 0;
975                         STp->block_size = 0;
976                         STp->ps[0].drv_file = STp->ps[0].drv_block = (-1);
977                         STp->partition = STp->new_partition = 0;
978                         STp->door_locked = ST_UNLOCKED;
979                         return CHKRES_NOT_READY;
980                 }
981         }
982
983         if (STp->omit_blklims)
984                 STp->min_block = STp->max_block = (-1);
985         else {
986                 memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
987                 cmd[0] = READ_BLOCK_LIMITS;
988
989                 SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, DMA_FROM_DEVICE,
990                                    STp->device->timeout, MAX_READY_RETRIES, 1);
991                 if (!SRpnt) {
992                         retval = (STp->buffer)->syscall_result;
993                         goto err_out;
994                 }
995
996                 if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) {
997                         STp->max_block = ((STp->buffer)->b_data[1] << 16) |
998                             ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3];
999                         STp->min_block = ((STp->buffer)->b_data[4] << 8) |
1000                             (STp->buffer)->b_data[5];
1001                         if ( DEB( debugging || ) !STp->inited)
1002                                 printk(KERN_WARNING
1003                                        "%s: Block limits %d - %d bytes.\n", name,
1004                                        STp->min_block, STp->max_block);
1005                 } else {
1006                         STp->min_block = STp->max_block = (-1);
1007                         DEBC(printk(ST_DEB_MSG "%s: Can't read block limits.\n",
1008                                        name));
1009                 }
1010         }
1011
1012         memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
1013         cmd[0] = MODE_SENSE;
1014         cmd[4] = 12;
1015
1016         SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, DMA_FROM_DEVICE,
1017                         STp->device->timeout, MAX_READY_RETRIES, 1);
1018         if (!SRpnt) {
1019                 retval = (STp->buffer)->syscall_result;
1020                 goto err_out;
1021         }
1022
1023         if ((STp->buffer)->syscall_result != 0) {
1024                 DEBC(printk(ST_DEB_MSG "%s: No Mode Sense.\n", name));
1025                 STp->block_size = ST_DEFAULT_BLOCK;     /* Educated guess (?) */
1026                 (STp->buffer)->syscall_result = 0;      /* Prevent error propagation */
1027                 STp->drv_write_prot = 0;
1028         } else {
1029                 DEBC(printk(ST_DEB_MSG
1030                             "%s: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n",
1031                             name,
1032                             (STp->buffer)->b_data[0], (STp->buffer)->b_data[1],
1033                             (STp->buffer)->b_data[2], (STp->buffer)->b_data[3]));
1034
1035                 if ((STp->buffer)->b_data[3] >= 8) {
1036                         STp->drv_buffer = ((STp->buffer)->b_data[2] >> 4) & 7;
1037                         STp->density = (STp->buffer)->b_data[4];
1038                         STp->block_size = (STp->buffer)->b_data[9] * 65536 +
1039                             (STp->buffer)->b_data[10] * 256 + (STp->buffer)->b_data[11];
1040                         DEBC(printk(ST_DEB_MSG
1041                                     "%s: Density %x, tape length: %x, drv buffer: %d\n",
1042                                     name, STp->density, (STp->buffer)->b_data[5] * 65536 +
1043                                     (STp->buffer)->b_data[6] * 256 + (STp->buffer)->b_data[7],
1044                                     STp->drv_buffer));
1045                 }
1046                 STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0;
1047         }
1048         st_release_request(SRpnt);
1049         SRpnt = NULL;
1050         STp->inited = 1;
1051
1052         if (STp->block_size > 0)
1053                 (STp->buffer)->buffer_blocks =
1054                         (STp->buffer)->buffer_size / STp->block_size;
1055         else
1056                 (STp->buffer)->buffer_blocks = 1;
1057         (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
1058
1059         DEBC(printk(ST_DEB_MSG
1060                        "%s: Block size: %d, buffer size: %d (%d blocks).\n", name,
1061                        STp->block_size, (STp->buffer)->buffer_size,
1062                        (STp->buffer)->buffer_blocks));
1063
1064         if (STp->drv_write_prot) {
1065                 STp->write_prot = 1;
1066
1067                 DEBC(printk(ST_DEB_MSG "%s: Write protected\n", name));
1068
1069                 if (do_wait &&
1070                     ((st_flags & O_ACCMODE) == O_WRONLY ||
1071                      (st_flags & O_ACCMODE) == O_RDWR)) {
1072                         retval = (-EROFS);
1073                         goto err_out;
1074                 }
1075         }
1076
1077         if (STp->can_partitions && STp->nbr_partitions < 1) {
1078                 /* This code is reached when the device is opened for the first time
1079                    after the driver has been initialized with tape in the drive and the
1080                    partition support has been enabled. */
1081                 DEBC(printk(ST_DEB_MSG
1082                             "%s: Updating partition number in status.\n", name));
1083                 if ((STp->partition = find_partition(STp)) < 0) {
1084                         retval = STp->partition;
1085                         goto err_out;
1086                 }
1087                 STp->new_partition = STp->partition;
1088                 STp->nbr_partitions = 1; /* This guess will be updated when necessary */
1089         }
1090
1091         if (new_session) {      /* Change the drive parameters for the new mode */
1092                 STp->density_changed = STp->blksize_changed = 0;
1093                 STp->compression_changed = 0;
1094                 if (!(STm->defaults_for_writes) &&
1095                     (retval = set_mode_densblk(STp, STm)) < 0)
1096                     goto err_out;
1097
1098                 if (STp->default_drvbuffer != 0xff) {
1099                         if (st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer))
1100                                 printk(KERN_WARNING
1101                                        "%s: Can't set default drive buffering to %d.\n",
1102                                        name, STp->default_drvbuffer);
1103                 }
1104         }
1105
1106         return CHKRES_READY;
1107
1108  err_out:
1109         return retval;
1110 }
1111
1112
1113 \f/* Open the device. Needs to be called with BKL only because of incrementing the SCSI host
1114    module count. */
1115 static int st_open(struct inode *inode, struct file *filp)
1116 {
1117         int i, retval = (-EIO);
1118         struct scsi_tape *STp;
1119         struct st_partstat *STps;
1120         int dev = TAPE_NR(inode);
1121         char *name;
1122
1123         /*
1124          * We really want to do nonseekable_open(inode, filp); here, but some
1125          * versions of tar incorrectly call lseek on tapes and bail out if that
1126          * fails.  So we disallow pread() and pwrite(), but permit lseeks.
1127          */
1128         filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
1129
1130         if (!(STp = scsi_tape_get(dev)))
1131                 return -ENXIO;
1132
1133         write_lock(&st_dev_arr_lock);
1134         filp->private_data = STp;
1135         name = tape_name(STp);
1136
1137         if (STp->in_use) {
1138                 write_unlock(&st_dev_arr_lock);
1139                 scsi_tape_put(STp);
1140                 DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); )
1141                 return (-EBUSY);
1142         }
1143
1144         STp->in_use = 1;
1145         write_unlock(&st_dev_arr_lock);
1146         STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;
1147
1148         if (!scsi_block_when_processing_errors(STp->device)) {
1149                 retval = (-ENXIO);
1150                 goto err_out;
1151         }
1152
1153         /* See that we have at least a one page buffer available */
1154         if (!enlarge_buffer(STp->buffer, PAGE_SIZE, STp->restr_dma)) {
1155                 printk(KERN_WARNING "%s: Can't allocate one page tape buffer.\n",
1156                        name);
1157                 retval = (-EOVERFLOW);
1158                 goto err_out;
1159         }
1160
1161         (STp->buffer)->writing = 0;
1162         (STp->buffer)->syscall_result = 0;
1163
1164         STp->write_prot = ((filp->f_flags & O_ACCMODE) == O_RDONLY);
1165
1166         STp->dirty = 0;
1167         for (i = 0; i < ST_NBR_PARTITIONS; i++) {
1168                 STps = &(STp->ps[i]);
1169                 STps->rw = ST_IDLE;
1170         }
1171         STp->recover_count = 0;
1172         DEB( STp->nbr_waits = STp->nbr_finished = 0;
1173              STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
1174
1175         retval = check_tape(STp, filp);
1176         if (retval < 0)
1177                 goto err_out;
1178         if ((filp->f_flags & O_NONBLOCK) == 0 &&
1179             retval != CHKRES_READY) {
1180                 retval = (-EIO);
1181                 goto err_out;
1182         }
1183         return 0;
1184
1185  err_out:
1186         normalize_buffer(STp->buffer);
1187         STp->in_use = 0;
1188         scsi_tape_put(STp);
1189         return retval;
1190
1191 }
1192 \f
1193
1194 /* Flush the tape buffer before close */
1195 static int st_flush(struct file *filp, fl_owner_t id)
1196 {
1197         int result = 0, result2;
1198         unsigned char cmd[MAX_COMMAND_SIZE];
1199         struct st_request *SRpnt;
1200         struct scsi_tape *STp = filp->private_data;
1201         struct st_modedef *STm = &(STp->modes[STp->current_mode]);
1202         struct st_partstat *STps = &(STp->ps[STp->partition]);
1203         char *name = tape_name(STp);
1204
1205         if (file_count(filp) > 1)
1206                 return 0;
1207
1208         if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1209                 result = flush_write_buffer(STp);
1210                 if (result != 0 && result != (-ENOSPC))
1211                         goto out;
1212         }
1213
1214         if (STp->can_partitions &&
1215             (result2 = switch_partition(STp)) < 0) {
1216                 DEBC(printk(ST_DEB_MSG
1217                                "%s: switch_partition at close failed.\n", name));
1218                 if (result == 0)
1219                         result = result2;
1220                 goto out;
1221         }
1222
1223         DEBC( if (STp->nbr_requests)
1224                 printk(KERN_WARNING "%s: Number of r/w requests %d, dio used in %d, pages %d (%d).\n",
1225                        name, STp->nbr_requests, STp->nbr_dio, STp->nbr_pages, STp->nbr_combinable));
1226
1227         if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1228                 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1229
1230                 DEBC(printk(ST_DEB_MSG "%s: Async write waits %d, finished %d.\n",
1231                             name, STp->nbr_waits, STp->nbr_finished);
1232                 )
1233
1234                 memset(cmd, 0, MAX_COMMAND_SIZE);
1235                 cmd[0] = WRITE_FILEMARKS;
1236                 cmd[4] = 1 + STp->two_fm;
1237
1238                 SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
1239                                    STp->device->timeout, MAX_WRITE_RETRIES, 1);
1240                 if (!SRpnt) {
1241                         result = (STp->buffer)->syscall_result;
1242                         goto out;
1243                 }
1244
1245                 if (STp->buffer->syscall_result == 0 ||
1246                     (cmdstatp->have_sense && !cmdstatp->deferred &&
1247                      (cmdstatp->flags & SENSE_EOM) &&
1248                      (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
1249                       cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
1250                      (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) {
1251                         /* Write successful at EOM */
1252                         st_release_request(SRpnt);
1253                         SRpnt = NULL;
1254                         if (STps->drv_file >= 0)
1255                                 STps->drv_file++;
1256                         STps->drv_block = 0;
1257                         if (STp->two_fm)
1258                                 cross_eof(STp, 0);
1259                         STps->eof = ST_FM;
1260                 }
1261                 else { /* Write error */
1262                         st_release_request(SRpnt);
1263                         SRpnt = NULL;
1264                         printk(KERN_ERR "%s: Error on write filemark.\n", name);
1265                         if (result == 0)
1266                                 result = (-EIO);
1267                 }
1268
1269                 DEBC(printk(ST_DEB_MSG "%s: Buffer flushed, %d EOF(s) written\n",
1270                             name, cmd[4]));
1271         } else if (!STp->rew_at_close) {
1272                 STps = &(STp->ps[STp->partition]);
1273                 if (!STm->sysv || STps->rw != ST_READING) {
1274                         if (STp->can_bsr)
1275                                 result = flush_buffer(STp, 0);
1276                         else if (STps->eof == ST_FM_HIT) {
1277                                 result = cross_eof(STp, 0);
1278                                 if (result) {
1279                                         if (STps->drv_file >= 0)
1280                                                 STps->drv_file++;
1281                                         STps->drv_block = 0;
1282                                         STps->eof = ST_FM;
1283                                 } else
1284                                         STps->eof = ST_NOEOF;
1285                         }
1286                 } else if ((STps->eof == ST_NOEOF &&
1287                             !(result = cross_eof(STp, 1))) ||
1288                            STps->eof == ST_FM_HIT) {
1289                         if (STps->drv_file >= 0)
1290                                 STps->drv_file++;
1291                         STps->drv_block = 0;
1292                         STps->eof = ST_FM;
1293                 }
1294         }
1295
1296       out:
1297         if (STp->rew_at_close) {
1298                 result2 = st_int_ioctl(STp, MTREW, 1);
1299                 if (result == 0)
1300                         result = result2;
1301         }
1302         return result;
1303 }
1304
1305
1306 /* Close the device and release it. BKL is not needed: this is the only thread
1307    accessing this tape. */
1308 static int st_release(struct inode *inode, struct file *filp)
1309 {
1310         int result = 0;
1311         struct scsi_tape *STp = filp->private_data;
1312
1313         if (STp->door_locked == ST_LOCKED_AUTO)
1314                 do_door_lock(STp, 0);
1315
1316         normalize_buffer(STp->buffer);
1317         write_lock(&st_dev_arr_lock);
1318         STp->in_use = 0;
1319         write_unlock(&st_dev_arr_lock);
1320         scsi_tape_put(STp);
1321
1322         return result;
1323 }
1324 \f
1325 /* The checks common to both reading and writing */
1326 static ssize_t rw_checks(struct scsi_tape *STp, struct file *filp, size_t count)
1327 {
1328         ssize_t retval = 0;
1329
1330         /*
1331          * If we are in the middle of error recovery, don't let anyone
1332          * else try and use this device.  Also, if error recovery fails, it
1333          * may try and take the device offline, in which case all further
1334          * access to the device is prohibited.
1335          */
1336         if (!scsi_block_when_processing_errors(STp->device)) {
1337                 retval = (-ENXIO);
1338                 goto out;
1339         }
1340
1341         if (STp->ready != ST_READY) {
1342                 if (STp->ready == ST_NO_TAPE)
1343                         retval = (-ENOMEDIUM);
1344                 else
1345                         retval = (-EIO);
1346                 goto out;
1347         }
1348
1349         if (! STp->modes[STp->current_mode].defined) {
1350                 retval = (-ENXIO);
1351                 goto out;
1352         }
1353
1354
1355         /*
1356          * If there was a bus reset, block further access
1357          * to this device.
1358          */
1359         if (STp->pos_unknown) {
1360                 retval = (-EIO);
1361                 goto out;
1362         }
1363
1364         if (count == 0)
1365                 goto out;
1366
1367         DEB(
1368         if (!STp->in_use) {
1369                 printk(ST_DEB_MSG "%s: Incorrect device.\n", tape_name(STp));
1370                 retval = (-EIO);
1371                 goto out;
1372         } ) /* end DEB */
1373
1374         if (STp->can_partitions &&
1375             (retval = switch_partition(STp)) < 0)
1376                 goto out;
1377
1378         if (STp->block_size == 0 && STp->max_block > 0 &&
1379             (count < STp->min_block || count > STp->max_block)) {
1380                 retval = (-EINVAL);
1381                 goto out;
1382         }
1383
1384         if (STp->do_auto_lock && STp->door_locked == ST_UNLOCKED &&
1385             !do_door_lock(STp, 1))
1386                 STp->door_locked = ST_LOCKED_AUTO;
1387
1388  out:
1389         return retval;
1390 }
1391
1392
1393 static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
1394                            size_t count, int is_read)
1395 {
1396         int i, bufsize, retval = 0;
1397         struct st_buffer *STbp = STp->buffer;
1398
1399         if (is_read)
1400                 i = STp->try_dio && try_rdio;
1401         else
1402                 i = STp->try_dio && try_wdio;
1403
1404         if (i && ((unsigned long)buf & queue_dma_alignment(
1405                                         STp->device->request_queue)) == 0) {
1406                 i = sgl_map_user_pages(&(STbp->sg[0]), STbp->use_sg,
1407                                       (unsigned long)buf, count, (is_read ? READ : WRITE));
1408                 if (i > 0) {
1409                         STbp->do_dio = i;
1410                         STbp->buffer_bytes = 0;   /* can be used as transfer counter */
1411                 }
1412                 else
1413                         STbp->do_dio = 0;  /* fall back to buffering with any error */
1414                 STbp->sg_segs = STbp->do_dio;
1415                 STbp->frp_sg_current = 0;
1416                 DEB(
1417                      if (STbp->do_dio) {
1418                         STp->nbr_dio++;
1419                         STp->nbr_pages += STbp->do_dio;
1420                         for (i=1; i < STbp->do_dio; i++)
1421                                 if (page_to_pfn(STbp->sg[i].page) == page_to_pfn(STbp->sg[i-1].page) + 1)
1422                                         STp->nbr_combinable++;
1423                      }
1424                 )
1425         } else
1426                 STbp->do_dio = 0;
1427         DEB( STp->nbr_requests++; )
1428
1429         if (!STbp->do_dio) {
1430                 if (STp->block_size)
1431                         bufsize = STp->block_size > st_fixed_buffer_size ?
1432                                 STp->block_size : st_fixed_buffer_size;
1433                 else
1434                         bufsize = count;
1435                 if (bufsize > STbp->buffer_size &&
1436                     !enlarge_buffer(STbp, bufsize, STp->restr_dma)) {
1437                         printk(KERN_WARNING "%s: Can't allocate %d byte tape buffer.\n",
1438                                tape_name(STp), bufsize);
1439                         retval = (-EOVERFLOW);
1440                         goto out;
1441                 }
1442                 if (STp->block_size)
1443                         STbp->buffer_blocks = bufsize / STp->block_size;
1444         }
1445
1446  out:
1447         return retval;
1448 }
1449
1450
1451 /* Can be called more than once after each setup_buffer() */
1452 static void release_buffering(struct scsi_tape *STp, int is_read)
1453 {
1454         struct st_buffer *STbp;
1455
1456         STbp = STp->buffer;
1457         if (STbp->do_dio) {
1458                 sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, is_read);
1459                 STbp->do_dio = 0;
1460                 STbp->sg_segs = 0;
1461         }
1462 }
1463
1464
1465 /* Write command */
1466 static ssize_t
1467 st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
1468 {
1469         ssize_t total;
1470         ssize_t i, do_count, blks, transfer;
1471         ssize_t retval;
1472         int undone, retry_eot = 0, scode;
1473         int async_write;
1474         unsigned char cmd[MAX_COMMAND_SIZE];
1475         const char __user *b_point;
1476         struct st_request *SRpnt = NULL;
1477         struct scsi_tape *STp = filp->private_data;
1478         struct st_modedef *STm;
1479         struct st_partstat *STps;
1480         struct st_buffer *STbp;
1481         char *name = tape_name(STp);
1482
1483         if (down_interruptible(&STp->lock))
1484                 return -ERESTARTSYS;
1485
1486         retval = rw_checks(STp, filp, count);
1487         if (retval || count == 0)
1488                 goto out;
1489
1490         /* Write must be integral number of blocks */
1491         if (STp->block_size != 0 && (count % STp->block_size) != 0) {
1492                 printk(KERN_WARNING "%s: Write not multiple of tape block size.\n",
1493                        name);
1494                 retval = (-EINVAL);
1495                 goto out;
1496         }
1497
1498         STm = &(STp->modes[STp->current_mode]);
1499         STps = &(STp->ps[STp->partition]);
1500
1501         if (STp->write_prot) {
1502                 retval = (-EACCES);
1503                 goto out;
1504         }
1505
1506
1507         if (STps->rw == ST_READING) {
1508                 retval = flush_buffer(STp, 0);
1509                 if (retval)
1510                         goto out;
1511                 STps->rw = ST_WRITING;
1512         } else if (STps->rw != ST_WRITING &&
1513                    STps->drv_file == 0 && STps->drv_block == 0) {
1514                 if ((retval = set_mode_densblk(STp, STm)) < 0)
1515                         goto out;
1516                 if (STm->default_compression != ST_DONT_TOUCH &&
1517                     !(STp->compression_changed)) {
1518                         if (st_compression(STp, (STm->default_compression == ST_YES))) {
1519                                 printk(KERN_WARNING "%s: Can't set default compression.\n",
1520                                        name);
1521                                 if (modes_defined) {
1522                                         retval = (-EINVAL);
1523                                         goto out;
1524                                 }
1525                         }
1526                 }
1527         }
1528
1529         STbp = STp->buffer;
1530         i = write_behind_check(STp);
1531         if (i) {
1532                 if (i == -ENOSPC)
1533                         STps->eof = ST_EOM_OK;
1534                 else
1535                         STps->eof = ST_EOM_ERROR;
1536         }
1537
1538         if (STps->eof == ST_EOM_OK) {
1539                 STps->eof = ST_EOD_1;  /* allow next write */
1540                 retval = (-ENOSPC);
1541                 goto out;
1542         }
1543         else if (STps->eof == ST_EOM_ERROR) {
1544                 retval = (-EIO);
1545                 goto out;
1546         }
1547
1548         /* Check the buffer readability in cases where copy_user might catch
1549            the problems after some tape movement. */
1550         if (STp->block_size != 0 &&
1551             !STbp->do_dio &&
1552             (copy_from_user(&i, buf, 1) != 0 ||
1553              copy_from_user(&i, buf + count - 1, 1) != 0)) {
1554                 retval = (-EFAULT);
1555                 goto out;
1556         }
1557
1558         retval = setup_buffering(STp, buf, count, 0);
1559         if (retval)
1560                 goto out;
1561
1562         total = count;
1563
1564         memset(cmd, 0, MAX_COMMAND_SIZE);
1565         cmd[0] = WRITE_6;
1566         cmd[1] = (STp->block_size != 0);
1567
1568         STps->rw = ST_WRITING;
1569
1570         b_point = buf;
1571         while (count > 0 && !retry_eot) {
1572
1573                 if (STbp->do_dio) {
1574                         do_count = count;
1575                 }
1576                 else {
1577                         if (STp->block_size == 0)
1578                                 do_count = count;
1579                         else {
1580                                 do_count = STbp->buffer_blocks * STp->block_size -
1581                                         STbp->buffer_bytes;
1582                                 if (do_count > count)
1583                                         do_count = count;
1584                         }
1585
1586                         i = append_to_buffer(b_point, STbp, do_count);
1587                         if (i) {
1588                                 retval = i;
1589                                 goto out;
1590                         }
1591                 }
1592                 count -= do_count;
1593                 b_point += do_count;
1594
1595                 async_write = STp->block_size == 0 && !STbp->do_dio &&
1596                         STm->do_async_writes && STps->eof < ST_EOM_OK;
1597
1598                 if (STp->block_size != 0 && STm->do_buffer_writes &&
1599                     !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
1600                     STbp->buffer_bytes < STbp->buffer_size) {
1601                         STp->dirty = 1;
1602                         /* Don't write a buffer that is not full enough. */
1603                         if (!async_write && count == 0)
1604                                 break;
1605                 }
1606
1607         retry_write:
1608                 if (STp->block_size == 0)
1609                         blks = transfer = do_count;
1610                 else {
1611                         if (!STbp->do_dio)
1612                                 blks = STbp->buffer_bytes;
1613                         else
1614                                 blks = do_count;
1615                         blks /= STp->block_size;
1616                         transfer = blks * STp->block_size;
1617                 }
1618                 cmd[2] = blks >> 16;
1619                 cmd[3] = blks >> 8;
1620                 cmd[4] = blks;
1621
1622                 SRpnt = st_do_scsi(SRpnt, STp, cmd, transfer, DMA_TO_DEVICE,
1623                                    STp->device->timeout, MAX_WRITE_RETRIES, !async_write);
1624                 if (!SRpnt) {
1625                         retval = STbp->syscall_result;
1626                         goto out;
1627                 }
1628                 if (async_write && !STbp->syscall_result) {
1629                         STbp->writing = transfer;
1630                         STp->dirty = !(STbp->writing ==
1631                                        STbp->buffer_bytes);
1632                         SRpnt = NULL;  /* Prevent releasing this request! */
1633                         DEB( STp->write_pending = 1; )
1634                         break;
1635                 }
1636
1637                 if (STbp->syscall_result != 0) {
1638                         struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1639
1640                         DEBC(printk(ST_DEB_MSG "%s: Error on write:\n", name));
1641                         if (cmdstatp->have_sense && (cmdstatp->flags & SENSE_EOM)) {
1642                                 scode = cmdstatp->sense_hdr.sense_key;
1643                                 if (cmdstatp->remainder_valid)
1644                                         undone = (int)cmdstatp->uremainder64;
1645                                 else if (STp->block_size == 0 &&
1646                                          scode == VOLUME_OVERFLOW)
1647                                         undone = transfer;
1648                                 else
1649                                         undone = 0;
1650                                 if (STp->block_size != 0)
1651                                         undone *= STp->block_size;
1652                                 if (undone <= do_count) {
1653                                         /* Only data from this write is not written */
1654                                         count += undone;
1655                                         do_count -= undone;
1656                                         if (STp->block_size)
1657                                                 blks = (transfer - undone) / STp->block_size;
1658                                         STps->eof = ST_EOM_OK;
1659                                         /* Continue in fixed block mode if all written
1660                                            in this request but still something left to write
1661                                            (retval left to zero)
1662                                         */
1663                                         if (STp->block_size == 0 ||
1664                                             undone > 0 || count == 0)
1665                                                 retval = (-ENOSPC); /* EOM within current request */
1666                                         DEBC(printk(ST_DEB_MSG
1667                                                        "%s: EOM with %d bytes unwritten.\n",
1668                                                        name, (int)count));
1669                                 } else {
1670                                         /* EOT within data buffered earlier (possible only
1671                                            in fixed block mode without direct i/o) */
1672                                         if (!retry_eot && !cmdstatp->deferred &&
1673                                             (scode == NO_SENSE || scode == RECOVERED_ERROR)) {
1674                                                 move_buffer_data(STp->buffer, transfer - undone);
1675                                                 retry_eot = 1;
1676                                                 if (STps->drv_block >= 0) {
1677                                                         STps->drv_block += (transfer - undone) /
1678                                                                 STp->block_size;
1679                                                 }
1680                                                 STps->eof = ST_EOM_OK;
1681                                                 DEBC(printk(ST_DEB_MSG
1682                                                             "%s: Retry write of %d bytes at EOM.\n",
1683                                                             name, STp->buffer->buffer_bytes));
1684                                                 goto retry_write;
1685                                         }
1686                                         else {
1687                                                 /* Either error within data buffered by driver or
1688                                                    failed retry */
1689                                                 count -= do_count;
1690                                                 blks = do_count = 0;
1691                                                 STps->eof = ST_EOM_ERROR;
1692                                                 STps->drv_block = (-1); /* Too cautious? */
1693                                                 retval = (-EIO);        /* EOM for old data */
1694                                                 DEBC(printk(ST_DEB_MSG
1695                                                             "%s: EOM with lost data.\n",
1696                                                             name));
1697                                         }
1698                                 }
1699                         } else {
1700                                 count += do_count;
1701                                 STps->drv_block = (-1);         /* Too cautious? */
1702                                 retval = STbp->syscall_result;
1703                         }
1704
1705                 }
1706
1707                 if (STps->drv_block >= 0) {
1708                         if (STp->block_size == 0)
1709                                 STps->drv_block += (do_count > 0);
1710                         else
1711                                 STps->drv_block += blks;
1712                 }
1713
1714                 STbp->buffer_bytes = 0;
1715                 STp->dirty = 0;
1716
1717                 if (retval || retry_eot) {
1718                         if (count < total)
1719                                 retval = total - count;
1720                         goto out;
1721                 }
1722         }
1723
1724         if (STps->eof == ST_EOD_1)
1725                 STps->eof = ST_EOM_OK;
1726         else if (STps->eof != ST_EOM_OK)
1727                 STps->eof = ST_NOEOF;
1728         retval = total - count;
1729
1730  out:
1731         if (SRpnt != NULL)
1732                 st_release_request(SRpnt);
1733         release_buffering(STp, 0);
1734         up(&STp->lock);
1735
1736         return retval;
1737 }
1738 \f
1739 /* Read data from the tape. Returns zero in the normal case, one if the
1740    eof status has changed, and the negative error code in case of a
1741    fatal error. Otherwise updates the buffer and the eof state.
1742
1743    Does release user buffer mapping if it is set.
1744 */
1745 static long read_tape(struct scsi_tape *STp, long count,
1746                       struct st_request ** aSRpnt)
1747 {
1748         int transfer, blks, bytes;
1749         unsigned char cmd[MAX_COMMAND_SIZE];
1750         struct st_request *SRpnt;
1751         struct st_modedef *STm;
1752         struct st_partstat *STps;
1753         struct st_buffer *STbp;
1754         int retval = 0;
1755         char *name = tape_name(STp);
1756
1757         if (count == 0)
1758                 return 0;
1759
1760         STm = &(STp->modes[STp->current_mode]);
1761         STps = &(STp->ps[STp->partition]);
1762         if (STps->eof == ST_FM_HIT)
1763                 return 1;
1764         STbp = STp->buffer;
1765
1766         if (STp->block_size == 0)
1767                 blks = bytes = count;
1768         else {
1769                 if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
1770                         blks = (STp->buffer)->buffer_blocks;
1771                         bytes = blks * STp->block_size;
1772                 } else {
1773                         bytes = count;
1774                         if (!STbp->do_dio && bytes > (STp->buffer)->buffer_size)
1775                                 bytes = (STp->buffer)->buffer_size;
1776                         blks = bytes / STp->block_size;
1777                         bytes = blks * STp->block_size;
1778                 }
1779         }
1780
1781         memset(cmd, 0, MAX_COMMAND_SIZE);
1782         cmd[0] = READ_6;
1783         cmd[1] = (STp->block_size != 0);
1784         cmd[2] = blks >> 16;
1785         cmd[3] = blks >> 8;
1786         cmd[4] = blks;
1787
1788         SRpnt = *aSRpnt;
1789         SRpnt = st_do_scsi(SRpnt, STp, cmd, bytes, DMA_FROM_DEVICE,
1790                            STp->device->timeout, MAX_RETRIES, 1);
1791         release_buffering(STp, 1);
1792         *aSRpnt = SRpnt;
1793         if (!SRpnt)
1794                 return STbp->syscall_result;
1795
1796         STbp->read_pointer = 0;
1797         STps->at_sm = 0;
1798
1799         /* Something to check */
1800         if (STbp->syscall_result) {
1801                 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1802
1803                 retval = 1;
1804                 DEBC(printk(ST_DEB_MSG "%s: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
1805                             name,
1806                             SRpnt->sense[0], SRpnt->sense[1],
1807                             SRpnt->sense[2], SRpnt->sense[3],
1808                             SRpnt->sense[4], SRpnt->sense[5],
1809                             SRpnt->sense[6], SRpnt->sense[7]));
1810                 if (cmdstatp->have_sense) {
1811
1812                         if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
1813                                 cmdstatp->flags &= 0xcf;        /* No need for EOM in this case */
1814
1815                         if (cmdstatp->flags != 0) { /* EOF, EOM, or ILI */
1816                                 /* Compute the residual count */
1817                                 if (cmdstatp->remainder_valid)
1818                                         transfer = (int)cmdstatp->uremainder64;
1819                                 else
1820                                         transfer = 0;
1821                                 if (STp->block_size == 0 &&
1822                                     cmdstatp->sense_hdr.sense_key == MEDIUM_ERROR)
1823                                         transfer = bytes;
1824
1825                                 if (cmdstatp->flags & SENSE_ILI) {      /* ILI */
1826                                         if (STp->block_size == 0) {
1827                                                 if (transfer <= 0) {
1828                                                         if (transfer < 0)
1829                                                                 printk(KERN_NOTICE
1830                                                                        "%s: Failed to read %d byte block with %d byte transfer.\n",
1831                                                                        name, bytes - transfer, bytes);
1832                                                         if (STps->drv_block >= 0)
1833                                                                 STps->drv_block += 1;
1834                                                         STbp->buffer_bytes = 0;
1835                                                         return (-ENOMEM);
1836                                                 }
1837                                                 STbp->buffer_bytes = bytes - transfer;
1838                                         } else {
1839                                                 st_release_request(SRpnt);
1840                                                 SRpnt = *aSRpnt = NULL;
1841                                                 if (transfer == blks) { /* We did not get anything, error */
1842                                                         printk(KERN_NOTICE "%s: Incorrect block size.\n", name);
1843                                                         if (STps->drv_block >= 0)
1844                                                                 STps->drv_block += blks - transfer + 1;
1845                                                         st_int_ioctl(STp, MTBSR, 1);
1846                                                         return (-EIO);
1847                                                 }
1848                                                 /* We have some data, deliver it */
1849                                                 STbp->buffer_bytes = (blks - transfer) *
1850                                                     STp->block_size;
1851                                                 DEBC(printk(ST_DEB_MSG
1852                                                             "%s: ILI but enough data received %ld %d.\n",
1853                                                             name, count, STbp->buffer_bytes));
1854                                                 if (STps->drv_block >= 0)
1855                                                         STps->drv_block += 1;
1856                                                 if (st_int_ioctl(STp, MTBSR, 1))
1857                                                         return (-EIO);
1858                                         }
1859                                 } else if (cmdstatp->flags & SENSE_FMK) {       /* FM overrides EOM */
1860                                         if (STps->eof != ST_FM_HIT)
1861                                                 STps->eof = ST_FM_HIT;
1862                                         else
1863                                                 STps->eof = ST_EOD_2;
1864                                         if (STp->block_size == 0)
1865                                                 STbp->buffer_bytes = 0;
1866                                         else
1867                                                 STbp->buffer_bytes =
1868                                                     bytes - transfer * STp->block_size;
1869                                         DEBC(printk(ST_DEB_MSG
1870                                                     "%s: EOF detected (%d bytes read).\n",
1871                                                     name, STbp->buffer_bytes));
1872                                 } else if (cmdstatp->flags & SENSE_EOM) {
1873                                         if (STps->eof == ST_FM)
1874                                                 STps->eof = ST_EOD_1;
1875                                         else
1876                                                 STps->eof = ST_EOM_OK;
1877                                         if (STp->block_size == 0)
1878                                                 STbp->buffer_bytes = bytes - transfer;
1879                                         else
1880                                                 STbp->buffer_bytes =
1881                                                     bytes - transfer * STp->block_size;
1882
1883                                         DEBC(printk(ST_DEB_MSG "%s: EOM detected (%d bytes read).\n",
1884                                                     name, STbp->buffer_bytes));
1885                                 }
1886                         }
1887                         /* end of EOF, EOM, ILI test */ 
1888                         else {  /* nonzero sense key */
1889                                 DEBC(printk(ST_DEB_MSG
1890                                             "%s: Tape error while reading.\n", name));
1891                                 STps->drv_block = (-1);
1892                                 if (STps->eof == ST_FM &&
1893                                     cmdstatp->sense_hdr.sense_key == BLANK_CHECK) {
1894                                         DEBC(printk(ST_DEB_MSG
1895                                                     "%s: Zero returned for first BLANK CHECK after EOF.\n",
1896                                                     name));
1897                                         STps->eof = ST_EOD_2;   /* First BLANK_CHECK after FM */
1898                                 } else  /* Some other extended sense code */
1899                                         retval = (-EIO);
1900                         }
1901
1902                         if (STbp->buffer_bytes < 0)  /* Caused by bogus sense data */
1903                                 STbp->buffer_bytes = 0;
1904                 }
1905                 /* End of extended sense test */ 
1906                 else {          /* Non-extended sense */
1907                         retval = STbp->syscall_result;
1908                 }
1909
1910         }
1911         /* End of error handling */ 
1912         else                    /* Read successful */
1913                 STbp->buffer_bytes = bytes;
1914
1915         if (STps->drv_block >= 0) {
1916                 if (STp->block_size == 0)
1917                         STps->drv_block++;
1918                 else
1919                         STps->drv_block += STbp->buffer_bytes / STp->block_size;
1920         }
1921         return retval;
1922 }
1923 \f
1924
1925 /* Read command */
1926 static ssize_t
1927 st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
1928 {
1929         ssize_t total;
1930         ssize_t retval = 0;
1931         ssize_t i, transfer;
1932         int special, do_dio = 0;
1933         struct st_request *SRpnt = NULL;
1934         struct scsi_tape *STp = filp->private_data;
1935         struct st_modedef *STm;
1936         struct st_partstat *STps;
1937         struct st_buffer *STbp = STp->buffer;
1938         DEB( char *name = tape_name(STp); )
1939
1940         if (down_interruptible(&STp->lock))
1941                 return -ERESTARTSYS;
1942
1943         retval = rw_checks(STp, filp, count);
1944         if (retval || count == 0)
1945                 goto out;
1946
1947         STm = &(STp->modes[STp->current_mode]);
1948         if (!(STm->do_read_ahead) && STp->block_size != 0 &&
1949             (count % STp->block_size) != 0) {
1950                 retval = (-EINVAL);     /* Read must be integral number of blocks */
1951                 goto out;
1952         }
1953
1954         STps = &(STp->ps[STp->partition]);
1955         if (STps->rw == ST_WRITING) {
1956                 retval = flush_buffer(STp, 0);
1957                 if (retval)
1958                         goto out;
1959                 STps->rw = ST_READING;
1960         }
1961         DEB(
1962         if (debugging && STps->eof != ST_NOEOF)
1963                 printk(ST_DEB_MSG "%s: EOF/EOM flag up (%d). Bytes %d\n", name,
1964                        STps->eof, STbp->buffer_bytes);
1965         ) /* end DEB */
1966
1967         retval = setup_buffering(STp, buf, count, 1);
1968         if (retval)
1969                 goto out;
1970         do_dio = STbp->do_dio;
1971
1972         if (STbp->buffer_bytes == 0 &&
1973             STps->eof >= ST_EOD_1) {
1974                 if (STps->eof < ST_EOD) {
1975                         STps->eof += 1;
1976                         retval = 0;
1977                         goto out;
1978                 }
1979                 retval = (-EIO);        /* EOM or Blank Check */
1980                 goto out;
1981         }
1982
1983         if (do_dio) {
1984                 /* Check the buffer writability before any tape movement. Don't alter
1985                    buffer data. */
1986                 if (copy_from_user(&i, buf, 1) != 0 ||
1987                     copy_to_user(buf, &i, 1) != 0 ||
1988                     copy_from_user(&i, buf + count - 1, 1) != 0 ||
1989                     copy_to_user(buf + count - 1, &i, 1) != 0) {
1990                         retval = (-EFAULT);
1991                         goto out;
1992                 }
1993         }
1994
1995         STps->rw = ST_READING;
1996
1997
1998         /* Loop until enough data in buffer or a special condition found */
1999         for (total = 0, special = 0; total < count && !special;) {
2000
2001                 /* Get new data if the buffer is empty */
2002                 if (STbp->buffer_bytes == 0) {
2003                         special = read_tape(STp, count - total, &SRpnt);
2004                         if (special < 0) {      /* No need to continue read */
2005                                 retval = special;
2006                                 goto out;
2007                         }
2008                 }
2009
2010                 /* Move the data from driver buffer to user buffer */
2011                 if (STbp->buffer_bytes > 0) {
2012                         DEB(
2013                         if (debugging && STps->eof != ST_NOEOF)
2014                                 printk(ST_DEB_MSG
2015                                        "%s: EOF up (%d). Left %d, needed %d.\n", name,
2016                                        STps->eof, STbp->buffer_bytes,
2017                                        (int)(count - total));
2018                         ) /* end DEB */
2019                         transfer = STbp->buffer_bytes < count - total ?
2020                             STbp->buffer_bytes : count - total;
2021                         if (!do_dio) {
2022                                 i = from_buffer(STbp, buf, transfer);
2023                                 if (i) {
2024                                         retval = i;
2025                                         goto out;
2026                                 }
2027                         }
2028                         buf += transfer;
2029                         total += transfer;
2030                 }
2031
2032                 if (STp->block_size == 0)
2033                         break;  /* Read only one variable length block */
2034
2035         }                       /* for (total = 0, special = 0;
2036                                    total < count && !special; ) */
2037
2038         /* Change the eof state if no data from tape or buffer */
2039         if (total == 0) {
2040                 if (STps->eof == ST_FM_HIT) {
2041                         STps->eof = ST_FM;
2042                         STps->drv_block = 0;
2043                         if (STps->drv_file >= 0)
2044                                 STps->drv_file++;
2045                 } else if (STps->eof == ST_EOD_1) {
2046                         STps->eof = ST_EOD_2;
2047                         STps->drv_block = 0;
2048                         if (STps->drv_file >= 0)
2049                                 STps->drv_file++;
2050                 } else if (STps->eof == ST_EOD_2)
2051                         STps->eof = ST_EOD;
2052         } else if (STps->eof == ST_FM)
2053                 STps->eof = ST_NOEOF;
2054         retval = total;
2055
2056  out:
2057         if (SRpnt != NULL) {
2058                 st_release_request(SRpnt);
2059                 SRpnt = NULL;
2060         }
2061         if (do_dio) {
2062                 release_buffering(STp, 1);
2063                 STbp->buffer_bytes = 0;
2064         }
2065         up(&STp->lock);
2066
2067         return retval;
2068 }
2069 \f
2070
2071
2072 DEB(
2073 /* Set the driver options */
2074 static void st_log_options(struct scsi_tape * STp, struct st_modedef * STm, char *name)
2075 {
2076         if (debugging) {
2077                 printk(KERN_INFO
2078                        "%s: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n",
2079                        name, STp->current_mode, STm->do_buffer_writes, STm->do_async_writes,
2080                        STm->do_read_ahead);
2081                 printk(KERN_INFO
2082                        "%s:    can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n",
2083                        name, STp->can_bsr, STp->two_fm, STp->fast_mteom, STp->do_auto_lock);
2084                 printk(KERN_INFO
2085                        "%s:    defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n",
2086                        name, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions,
2087                        STp->scsi2_logical);
2088                 printk(KERN_INFO
2089                        "%s:    sysv: %d nowait: %d\n", name, STm->sysv, STp->immediate);
2090                 printk(KERN_INFO "%s:    debugging: %d\n",
2091                        name, debugging);
2092         }
2093 }
2094         )
2095
2096
2097 static int st_set_options(struct scsi_tape *STp, long options)
2098 {
2099         int value;
2100         long code;
2101         struct st_modedef *STm;
2102         char *name = tape_name(STp);
2103         struct cdev *cd0, *cd1;
2104
2105         STm = &(STp->modes[STp->current_mode]);
2106         if (!STm->defined) {
2107                 cd0 = STm->cdevs[0]; cd1 = STm->cdevs[1];
2108                 memcpy(STm, &(STp->modes[0]), sizeof(struct st_modedef));
2109                 STm->cdevs[0] = cd0; STm->cdevs[1] = cd1;
2110                 modes_defined = 1;
2111                 DEBC(printk(ST_DEB_MSG
2112                             "%s: Initialized mode %d definition from mode 0\n",
2113                             name, STp->current_mode));
2114         }
2115
2116         code = options & MT_ST_OPTIONS;
2117         if (code == MT_ST_BOOLEANS) {
2118                 STm->do_buffer_writes = (options & MT_ST_BUFFER_WRITES) != 0;
2119                 STm->do_async_writes = (options & MT_ST_ASYNC_WRITES) != 0;
2120                 STm->defaults_for_writes = (options & MT_ST_DEF_WRITES) != 0;
2121                 STm->do_read_ahead = (options & MT_ST_READ_AHEAD) != 0;
2122                 STp->two_fm = (options & MT_ST_TWO_FM) != 0;
2123                 STp->fast_mteom = (options & MT_ST_FAST_MTEOM) != 0;
2124                 STp->do_auto_lock = (options & MT_ST_AUTO_LOCK) != 0;
2125                 STp->can_bsr = (options & MT_ST_CAN_BSR) != 0;
2126                 STp->omit_blklims = (options & MT_ST_NO_BLKLIMS) != 0;
2127                 if ((STp->device)->scsi_level >= SCSI_2)
2128                         STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0;
2129                 STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0;
2130                 STp->immediate = (options & MT_ST_NOWAIT) != 0;
2131                 STm->sysv = (options & MT_ST_SYSV) != 0;
2132                 DEB( debugging = (options & MT_ST_DEBUGGING) != 0;
2133                      st_log_options(STp, STm, name); )
2134         } else if (code == MT_ST_SETBOOLEANS || code == MT_ST_CLEARBOOLEANS) {
2135                 value = (code == MT_ST_SETBOOLEANS);
2136                 if ((options & MT_ST_BUFFER_WRITES) != 0)
2137                         STm->do_buffer_writes = value;
2138                 if ((options & MT_ST_ASYNC_WRITES) != 0)
2139                         STm->do_async_writes = value;
2140                 if ((options & MT_ST_DEF_WRITES) != 0)
2141                         STm->defaults_for_writes = value;
2142                 if ((options & MT_ST_READ_AHEAD) != 0)
2143                         STm->do_read_ahead = value;
2144                 if ((options & MT_ST_TWO_FM) != 0)
2145                         STp->two_fm = value;
2146                 if ((options & MT_ST_FAST_MTEOM) != 0)
2147                         STp->fast_mteom = value;
2148                 if ((options & MT_ST_AUTO_LOCK) != 0)
2149                         STp->do_auto_lock = value;
2150                 if ((options & MT_ST_CAN_BSR) != 0)
2151                         STp->can_bsr = value;
2152                 if ((options & MT_ST_NO_BLKLIMS) != 0)
2153                         STp->omit_blklims = value;
2154                 if ((STp->device)->scsi_level >= SCSI_2 &&
2155                     (options & MT_ST_CAN_PARTITIONS) != 0)
2156                         STp->can_partitions = value;
2157                 if ((options & MT_ST_SCSI2LOGICAL) != 0)
2158                         STp->scsi2_logical = value;
2159                 if ((options & MT_ST_NOWAIT) != 0)
2160                         STp->immediate = value;
2161                 if ((options & MT_ST_SYSV) != 0)
2162                         STm->sysv = value;
2163                 DEB(
2164                 if ((options & MT_ST_DEBUGGING) != 0)
2165                         debugging = value;
2166                         st_log_options(STp, STm, name); )
2167         } else if (code == MT_ST_WRITE_THRESHOLD) {
2168                 /* Retained for compatibility */
2169         } else if (code == MT_ST_DEF_BLKSIZE) {
2170                 value = (options & ~MT_ST_OPTIONS);
2171                 if (value == ~MT_ST_OPTIONS) {
2172                         STm->default_blksize = (-1);
2173                         DEBC( printk(KERN_INFO "%s: Default block size disabled.\n", name));
2174                 } else {
2175                         STm->default_blksize = value;
2176                         DEBC( printk(KERN_INFO "%s: Default block size set to %d bytes.\n",
2177                                name, STm->default_blksize));
2178                         if (STp->ready == ST_READY) {
2179                                 STp->blksize_changed = 0;
2180                                 set_mode_densblk(STp, STm);
2181                         }
2182                 }
2183         } else if (code == MT_ST_TIMEOUTS) {
2184                 value = (options & ~MT_ST_OPTIONS);
2185                 if ((value & MT_ST_SET_LONG_TIMEOUT) != 0) {
2186                         STp->long_timeout = (value & ~MT_ST_SET_LONG_TIMEOUT) * HZ;
2187                         DEBC( printk(KERN_INFO "%s: Long timeout set to %d seconds.\n", name,
2188                                (value & ~MT_ST_SET_LONG_TIMEOUT)));
2189                 } else {
2190                         STp->device->timeout = value * HZ;
2191                         DEBC( printk(KERN_INFO "%s: Normal timeout set to %d seconds.\n",
2192                                 name, value) );
2193                 }
2194         } else if (code == MT_ST_SET_CLN) {
2195                 value = (options & ~MT_ST_OPTIONS) & 0xff;
2196                 if (value != 0 &&
2197                     value < EXTENDED_SENSE_START && value >= SCSI_SENSE_BUFFERSIZE)
2198                         return (-EINVAL);
2199                 STp->cln_mode = value;
2200                 STp->cln_sense_mask = (options >> 8) & 0xff;
2201                 STp->cln_sense_value = (options >> 16) & 0xff;
2202                 printk(KERN_INFO
2203                        "%s: Cleaning request mode %d, mask %02x, value %02x\n",
2204                        name, value, STp->cln_sense_mask, STp->cln_sense_value);
2205         } else if (code == MT_ST_DEF_OPTIONS) {
2206                 code = (options & ~MT_ST_CLEAR_DEFAULT);
2207                 value = (options & MT_ST_CLEAR_DEFAULT);
2208                 if (code == MT_ST_DEF_DENSITY) {
2209                         if (value == MT_ST_CLEAR_DEFAULT) {
2210                                 STm->default_density = (-1);
2211                                 DEBC( printk(KERN_INFO "%s: Density default disabled.\n",
2212                                        name));
2213                         } else {
2214                                 STm->default_density = value & 0xff;
2215                                 DEBC( printk(KERN_INFO "%s: Density default set to %x\n",
2216                                        name, STm->default_density));
2217                                 if (STp->ready == ST_READY) {
2218                                         STp->density_changed = 0;
2219                                         set_mode_densblk(STp, STm);
2220                                 }
2221                         }
2222                 } else if (code == MT_ST_DEF_DRVBUFFER) {
2223                         if (value == MT_ST_CLEAR_DEFAULT) {
2224                                 STp->default_drvbuffer = 0xff;
2225                                 DEBC( printk(KERN_INFO
2226                                        "%s: Drive buffer default disabled.\n", name));
2227                         } else {
2228                                 STp->default_drvbuffer = value & 7;
2229                                 DEBC( printk(KERN_INFO
2230                                        "%s: Drive buffer default set to %x\n",
2231                                        name, STp->default_drvbuffer));
2232                                 if (STp->ready == ST_READY)
2233                                         st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer);
2234                         }
2235                 } else if (code == MT_ST_DEF_COMPRESSION) {
2236                         if (value == MT_ST_CLEAR_DEFAULT) {
2237                                 STm->default_compression = ST_DONT_TOUCH;
2238                                 DEBC( printk(KERN_INFO
2239                                        "%s: Compression default disabled.\n", name));
2240                         } else {
2241                                 if ((value & 0xff00) != 0) {
2242                                         STp->c_algo = (value & 0xff00) >> 8;
2243                                         DEBC( printk(KERN_INFO "%s: Compression algorithm set to 0x%x.\n",
2244                                                name, STp->c_algo));
2245                                 }
2246                                 if ((value & 0xff) != 0xff) {
2247                                         STm->default_compression = (value & 1 ? ST_YES : ST_NO);
2248                                         DEBC( printk(KERN_INFO "%s: Compression default set to %x\n",
2249                                                name, (value & 1)));
2250                                         if (STp->ready == ST_READY) {
2251                                                 STp->compression_changed = 0;
2252                                                 st_compression(STp, (STm->default_compression == ST_YES));
2253                                         }
2254                                 }
2255                         }
2256                 }
2257         } else
2258                 return (-EIO);
2259
2260         return 0;
2261 }
2262 \f
2263 #define MODE_HEADER_LENGTH  4
2264
2265 /* Mode header and page byte offsets */
2266 #define MH_OFF_DATA_LENGTH     0
2267 #define MH_OFF_MEDIUM_TYPE     1
2268 #define MH_OFF_DEV_SPECIFIC    2
2269 #define MH_OFF_BDESCS_LENGTH   3
2270 #define MP_OFF_PAGE_NBR        0
2271 #define MP_OFF_PAGE_LENGTH     1
2272
2273 /* Mode header and page bit masks */
2274 #define MH_BIT_WP              0x80
2275 #define MP_MSK_PAGE_NBR        0x3f
2276
2277 /* Don't return block descriptors */
2278 #define MODE_SENSE_OMIT_BDESCS 0x08
2279
2280 #define MODE_SELECT_PAGE_FORMAT 0x10
2281
2282 /* Read a mode page into the tape buffer. The block descriptors are included
2283    if incl_block_descs is true. The page control is ored to the page number
2284    parameter, if necessary. */
2285 static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
2286 {
2287         unsigned char cmd[MAX_COMMAND_SIZE];
2288         struct st_request *SRpnt = NULL;
2289
2290         memset(cmd, 0, MAX_COMMAND_SIZE);
2291         cmd[0] = MODE_SENSE;
2292         if (omit_block_descs)
2293                 cmd[1] = MODE_SENSE_OMIT_BDESCS;
2294         cmd[2] = page;
2295         cmd[4] = 255;
2296
2297         SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE,
2298                            STp->device->timeout, 0, 1);
2299         if (SRpnt == NULL)
2300                 return (STp->buffer)->syscall_result;
2301
2302         st_release_request(SRpnt);
2303
2304         return (STp->buffer)->syscall_result;
2305 }
2306
2307
2308 /* Send the mode page in the tape buffer to the drive. Assumes that the mode data
2309    in the buffer is correctly formatted. The long timeout is used if slow is non-zero. */
2310 static int write_mode_page(struct scsi_tape *STp, int page, int slow)
2311 {
2312         int pgo;
2313         unsigned char cmd[MAX_COMMAND_SIZE];
2314         struct st_request *SRpnt = NULL;
2315
2316         memset(cmd, 0, MAX_COMMAND_SIZE);
2317         cmd[0] = MODE_SELECT;
2318         cmd[1] = MODE_SELECT_PAGE_FORMAT;
2319         pgo = MODE_HEADER_LENGTH + (STp->buffer)->b_data[MH_OFF_BDESCS_LENGTH];
2320         cmd[4] = pgo + (STp->buffer)->b_data[pgo + MP_OFF_PAGE_LENGTH] + 2;
2321
2322         /* Clear reserved fields */
2323         (STp->buffer)->b_data[MH_OFF_DATA_LENGTH] = 0;
2324         (STp->buffer)->b_data[MH_OFF_MEDIUM_TYPE] = 0;
2325         (STp->buffer)->b_data[MH_OFF_DEV_SPECIFIC] &= ~MH_BIT_WP;
2326         (STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR;
2327
2328         SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE,
2329                            (slow ? STp->long_timeout : STp->device->timeout), 0, 1);
2330         if (SRpnt == NULL)
2331                 return (STp->buffer)->syscall_result;
2332
2333         st_release_request(SRpnt);
2334
2335         return (STp->buffer)->syscall_result;
2336 }
2337
2338
2339 #define COMPRESSION_PAGE        0x0f
2340 #define COMPRESSION_PAGE_LENGTH 16
2341
2342 #define CP_OFF_DCE_DCC          2
2343 #define CP_OFF_C_ALGO           7
2344
2345 #define DCE_MASK  0x80
2346 #define DCC_MASK  0x40
2347 #define RED_MASK  0x60
2348
2349
2350 /* Control the compression with mode page 15. Algorithm not changed if zero.
2351
2352    The block descriptors are read and written because Sony SDT-7000 does not
2353    work without this (suggestion from Michael Schaefer <Michael.Schaefer@dlr.de>).
2354    Including block descriptors should not cause any harm to other drives. */
2355
2356 static int st_compression(struct scsi_tape * STp, int state)
2357 {
2358         int retval;
2359         int mpoffs;  /* Offset to mode page start */
2360         unsigned char *b_data = (STp->buffer)->b_data;
2361         DEB( char *name = tape_name(STp); )
2362
2363         if (STp->ready != ST_READY)
2364                 return (-EIO);
2365
2366         /* Read the current page contents */
2367         retval = read_mode_page(STp, COMPRESSION_PAGE, 0);
2368         if (retval) {
2369                 DEBC(printk(ST_DEB_MSG "%s: Compression mode page not supported.\n",
2370                             name));
2371                 return (-EIO);
2372         }
2373
2374         mpoffs = MODE_HEADER_LENGTH + b_data[MH_OFF_BDESCS_LENGTH];
2375         DEBC(printk(ST_DEB_MSG "%s: Compression state is %d.\n", name,
2376                     (b_data[mpoffs + CP_OFF_DCE_DCC] & DCE_MASK ? 1 : 0)));
2377
2378         /* Check if compression can be changed */
2379         if ((b_data[mpoffs + CP_OFF_DCE_DCC] & DCC_MASK) == 0) {
2380                 DEBC(printk(ST_DEB_MSG "%s: Compression not supported.\n", name));
2381                 return (-EIO);
2382         }
2383
2384         /* Do the change */
2385         if (state) {
2386                 b_data[mpoffs + CP_OFF_DCE_DCC] |= DCE_MASK;
2387                 if (STp->c_algo != 0)
2388                         b_data[mpoffs + CP_OFF_C_ALGO] = STp->c_algo;
2389         }
2390         else {
2391                 b_data[mpoffs + CP_OFF_DCE_DCC] &= ~DCE_MASK;
2392                 if (STp->c_algo != 0)
2393                         b_data[mpoffs + CP_OFF_C_ALGO] = 0; /* no compression */
2394         }
2395
2396         retval = write_mode_page(STp, COMPRESSION_PAGE, 0);
2397         if (retval) {
2398                 DEBC(printk(ST_DEB_MSG "%s: Compression change failed.\n", name));
2399                 return (-EIO);
2400         }
2401         DEBC(printk(ST_DEB_MSG "%s: Compression state changed to %d.\n",
2402                        name, state));
2403
2404         STp->compression_changed = 1;
2405         return 0;
2406 }
2407
2408
2409 /* Process the load and unload commands (does unload if the load code is zero) */
2410 static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_code)
2411 {
2412         int retval = (-EIO), timeout;
2413         DEB( char *name = tape_name(STp); )
2414         unsigned char cmd[MAX_COMMAND_SIZE];
2415         struct st_partstat *STps;
2416         struct st_request *SRpnt;
2417
2418         if (STp->ready != ST_READY && !load_code) {
2419                 if (STp->ready == ST_NO_TAPE)
2420                         return (-ENOMEDIUM);
2421                 else
2422                         return (-EIO);
2423         }
2424
2425         memset(cmd, 0, MAX_COMMAND_SIZE);
2426         cmd[0] = START_STOP;
2427         if (load_code)
2428                 cmd[4] |= 1;
2429         /*
2430          * If arg >= 1 && arg <= 6 Enhanced load/unload in HP C1553A
2431          */
2432         if (load_code >= 1 + MT_ST_HPLOADER_OFFSET
2433             && load_code <= 6 + MT_ST_HPLOADER_OFFSET) {
2434                 DEBC(printk(ST_DEB_MSG "%s: Enhanced %sload slot %2d.\n",
2435                             name, (cmd[4]) ? "" : "un",
2436                             load_code - MT_ST_HPLOADER_OFFSET));
2437                 cmd[3] = load_code - MT_ST_HPLOADER_OFFSET; /* MediaID field of C1553A */
2438         }
2439         if (STp->immediate) {
2440                 cmd[1] = 1;     /* Don't wait for completion */
2441                 timeout = STp->device->timeout;
2442         }
2443         else
2444                 timeout = STp->long_timeout;
2445
2446         DEBC(
2447                 if (!load_code)
2448                 printk(ST_DEB_MSG "%s: Unloading tape.\n", name);
2449                 else
2450                 printk(ST_DEB_MSG "%s: Loading tape.\n", name);
2451                 );
2452
2453         SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
2454                            timeout, MAX_RETRIES, 1);
2455         if (!SRpnt)
2456                 return (STp->buffer)->syscall_result;
2457
2458         retval = (STp->buffer)->syscall_result;
2459         st_release_request(SRpnt);
2460
2461         if (!retval) {  /* SCSI command successful */
2462
2463                 if (!load_code) {
2464                         STp->rew_at_close = 0;
2465                         STp->ready = ST_NO_TAPE;
2466                 }
2467                 else {
2468                         STp->rew_at_close = STp->autorew_dev;
2469                         retval = check_tape(STp, filp);
2470                         if (retval > 0)
2471                                 retval = 0;
2472                 }
2473         }
2474         else {
2475                 STps = &(STp->ps[STp->partition]);
2476                 STps->drv_file = STps->drv_block = (-1);
2477         }
2478
2479         return retval;
2480 }
2481 \f
2482 #if DEBUG
2483 #define ST_DEB_FORWARD  0
2484 #define ST_DEB_BACKWARD 1
2485 static void deb_space_print(char *name, int direction, char *units, unsigned char *cmd)
2486 {
2487         s32 sc;
2488
2489         sc = cmd[2] & 0x80 ? 0xff000000 : 0;
2490         sc |= (cmd[2] << 16) | (cmd[3] << 8) | cmd[4];
2491         if (direction)
2492                 sc = -sc;
2493         printk(ST_DEB_MSG "%s: Spacing tape %s over %d %s.\n", name,
2494                direction ? "backward" : "forward", sc, units);
2495 }
2496 #endif
2497
2498
2499 /* Internal ioctl function */
2500 static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned long arg)
2501 {
2502         int timeout;
2503         long ltmp;
2504         int ioctl_result;
2505         int chg_eof = 1;
2506         unsigned char cmd[MAX_COMMAND_SIZE];
2507         struct st_request *SRpnt;
2508         struct st_partstat *STps;
2509         int fileno, blkno, at_sm, undone;
2510         int datalen = 0, direction = DMA_NONE;
2511         char *name = tape_name(STp);
2512
2513         WARN_ON(STp->buffer->do_dio != 0);
2514         if (STp->ready != ST_READY) {
2515                 if (STp->ready == ST_NO_TAPE)
2516                         return (-ENOMEDIUM);
2517                 else
2518                         return (-EIO);
2519         }
2520         timeout = STp->long_timeout;
2521         STps = &(STp->ps[STp->partition]);
2522         fileno = STps->drv_file;
2523         blkno = STps->drv_block;
2524         at_sm = STps->at_sm;
2525
2526         memset(cmd, 0, MAX_COMMAND_SIZE);
2527         switch (cmd_in) {
2528         case MTFSFM:
2529                 chg_eof = 0;    /* Changed from the FSF after this */
2530         case MTFSF:
2531                 cmd[0] = SPACE;
2532                 cmd[1] = 0x01;  /* Space FileMarks */
2533                 cmd[2] = (arg >> 16);
2534                 cmd[3] = (arg >> 8);
2535                 cmd[4] = arg;
2536                 DEBC(deb_space_print(name, ST_DEB_FORWARD, "filemarks", cmd);)
2537                 if (fileno >= 0)
2538                         fileno += arg;
2539                 blkno = 0;
2540                 at_sm &= (arg == 0);
2541                 break;
2542         case MTBSFM:
2543                 chg_eof = 0;    /* Changed from the FSF after this */
2544         case MTBSF:
2545                 cmd[0] = SPACE;
2546                 cmd[1] = 0x01;  /* Space FileMarks */
2547                 ltmp = (-arg);
2548                 cmd[2] = (ltmp >> 16);
2549                 cmd[3] = (ltmp >> 8);
2550                 cmd[4] = ltmp;
2551                 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "filemarks", cmd);)
2552                 if (fileno >= 0)
2553                         fileno -= arg;
2554                 blkno = (-1);   /* We can't know the block number */
2555                 at_sm &= (arg == 0);
2556                 break;
2557         case MTFSR:
2558                 cmd[0] = SPACE;
2559                 cmd[1] = 0x00;  /* Space Blocks */
2560                 cmd[2] = (arg >> 16);
2561                 cmd[3] = (arg >> 8);
2562                 cmd[4] = arg;
2563                 DEBC(deb_space_print(name, ST_DEB_FORWARD, "blocks", cmd);)
2564                 if (blkno >= 0)
2565                         blkno += arg;
2566                 at_sm &= (arg == 0);
2567                 break;
2568         case MTBSR:
2569                 cmd[0] = SPACE;
2570                 cmd[1] = 0x00;  /* Space Blocks */
2571                 ltmp = (-arg);
2572                 cmd[2] = (ltmp >> 16);
2573                 cmd[3] = (ltmp >> 8);
2574                 cmd[4] = ltmp;
2575                 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "blocks", cmd);)
2576                 if (blkno >= 0)
2577                         blkno -= arg;
2578                 at_sm &= (arg == 0);
2579                 break;
2580         case MTFSS:
2581                 cmd[0] = SPACE;
2582                 cmd[1] = 0x04;  /* Space Setmarks */
2583                 cmd[2] = (arg >> 16);
2584                 cmd[3] = (arg >> 8);
2585                 cmd[4] = arg;
2586                 DEBC(deb_space_print(name, ST_DEB_FORWARD, "setmarks", cmd);)
2587                 if (arg != 0) {
2588                         blkno = fileno = (-1);
2589                         at_sm = 1;
2590                 }
2591                 break;
2592         case MTBSS:
2593                 cmd[0] = SPACE;
2594                 cmd[1] = 0x04;  /* Space Setmarks */
2595                 ltmp = (-arg);
2596                 cmd[2] = (ltmp >> 16);
2597                 cmd[3] = (ltmp >> 8);
2598                 cmd[4] = ltmp;
2599                 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "setmarks", cmd);)
2600                 if (arg != 0) {
2601                         blkno = fileno = (-1);
2602                         at_sm = 1;
2603                 }
2604                 break;
2605         case MTWEOF:
2606         case MTWSM:
2607                 if (STp->write_prot)
2608                         return (-EACCES);
2609                 cmd[0] = WRITE_FILEMARKS;
2610                 if (cmd_in == MTWSM)
2611                         cmd[1] = 2;
2612                 cmd[2] = (arg >> 16);
2613                 cmd[3] = (arg >> 8);
2614                 cmd[4] = arg;
2615                 timeout = STp->device->timeout;
2616                 DEBC(
2617                      if (cmd_in == MTWEOF)
2618                                printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name,
2619                                  cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2620                      else
2621                                 printk(ST_DEB_MSG "%s: Writing %d setmarks.\n", name,
2622                                  cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2623                 )
2624                 if (fileno >= 0)
2625                         fileno += arg;
2626                 blkno = 0;
2627                 at_sm = (cmd_in == MTWSM);
2628                 break;
2629         case MTREW:
2630                 cmd[0] = REZERO_UNIT;
2631                 if (STp->immediate) {
2632                         cmd[1] = 1;     /* Don't wait for completion */
2633                         timeout = STp->device->timeout;
2634                 }
2635                 DEBC(printk(ST_DEB_MSG "%s: Rewinding tape.\n", name));
2636                 fileno = blkno = at_sm = 0;
2637                 break;
2638         case MTNOP:
2639                 DEBC(printk(ST_DEB_MSG "%s: No op on tape.\n", name));
2640                 return 0;       /* Should do something ? */
2641                 break;
2642         case MTRETEN:
2643                 cmd[0] = START_STOP;
2644                 if (STp->immediate) {
2645                         cmd[1] = 1;     /* Don't wait for completion */
2646                         timeout = STp->device->timeout;
2647                 }
2648                 cmd[4] = 3;
2649                 DEBC(printk(ST_DEB_MSG "%s: Retensioning tape.\n", name));
2650                 fileno = blkno = at_sm = 0;
2651                 break;
2652         case MTEOM:
2653                 if (!STp->fast_mteom) {
2654                         /* space to the end of tape */
2655                         ioctl_result = st_int_ioctl(STp, MTFSF, 0x7fffff);
2656                         fileno = STps->drv_file;
2657                         if (STps->eof >= ST_EOD_1)
2658                                 return 0;
2659                         /* The next lines would hide the number of spaced FileMarks
2660                            That's why I inserted the previous lines. I had no luck
2661                            with detecting EOM with FSF, so we go now to EOM.
2662                            Joerg Weule */
2663                 } else
2664                         fileno = (-1);
2665                 cmd[0] = SPACE;
2666                 cmd[1] = 3;
2667                 DEBC(printk(ST_DEB_MSG "%s: Spacing to end of recorded medium.\n",
2668                             name));
2669                 blkno = -1;
2670                 at_sm = 0;
2671                 break;
2672         case MTERASE:
2673                 if (STp->write_prot)
2674                         return (-EACCES);
2675                 cmd[0] = ERASE;
2676                 cmd[1] = (arg ? 1 : 0); /* Long erase with non-zero argument */
2677                 if (STp->immediate) {
2678                         cmd[1] |= 2;    /* Don't wait for completion */
2679                         timeout = STp->device->timeout;
2680                 }
2681                 else
2682                         timeout = STp->long_timeout * 8;
2683
2684                 DEBC(printk(ST_DEB_MSG "%s: Erasing tape.\n", name));
2685                 fileno = blkno = at_sm = 0;
2686                 break;
2687         case MTSETBLK:          /* Set block length */
2688         case MTSETDENSITY:      /* Set tape density */
2689         case MTSETDRVBUFFER:    /* Set drive buffering */
2690         case SET_DENS_AND_BLK:  /* Set density and block size */
2691                 chg_eof = 0;
2692                 if (STp->dirty || (STp->buffer)->buffer_bytes != 0)
2693                         return (-EIO);  /* Not allowed if data in buffer */
2694                 if ((cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) &&
2695                     (arg & MT_ST_BLKSIZE_MASK) != 0 &&
2696                     STp->max_block > 0 &&
2697                     ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block ||
2698                      (arg & MT_ST_BLKSIZE_MASK) > STp->max_block)) {
2699                         printk(KERN_WARNING "%s: Illegal block size.\n", name);
2700                         return (-EINVAL);
2701                 }
2702                 cmd[0] = MODE_SELECT;
2703                 if ((STp->use_pf & USE_PF))
2704                         cmd[1] = MODE_SELECT_PAGE_FORMAT;
2705                 cmd[4] = datalen = 12;
2706                 direction = DMA_TO_DEVICE;
2707
2708                 memset((STp->buffer)->b_data, 0, 12);
2709                 if (cmd_in == MTSETDRVBUFFER)
2710                         (STp->buffer)->b_data[2] = (arg & 7) << 4;
2711                 else
2712                         (STp->buffer)->b_data[2] =
2713                             STp->drv_buffer << 4;
2714                 (STp->buffer)->b_data[3] = 8;   /* block descriptor length */
2715                 if (cmd_in == MTSETDENSITY) {
2716                         (STp->buffer)->b_data[4] = arg;
2717                         STp->density_changed = 1;       /* At least we tried ;-) */
2718                 } else if (cmd_in == SET_DENS_AND_BLK)
2719                         (STp->buffer)->b_data[4] = arg >> 24;
2720                 else
2721                         (STp->buffer)->b_data[4] = STp->density;
2722                 if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2723                         ltmp = arg & MT_ST_BLKSIZE_MASK;
2724                         if (cmd_in == MTSETBLK)
2725                                 STp->blksize_changed = 1; /* At least we tried ;-) */
2726                 } else
2727                         ltmp = STp->block_size;
2728                 (STp->buffer)->b_data[9] = (ltmp >> 16);
2729                 (STp->buffer)->b_data[10] = (ltmp >> 8);
2730                 (STp->buffer)->b_data[11] = ltmp;
2731                 timeout = STp->device->timeout;
2732                 DEBC(
2733                         if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK)
2734                                 printk(ST_DEB_MSG
2735                                        "%s: Setting block size to %d bytes.\n", name,
2736                                        (STp->buffer)->b_data[9] * 65536 +
2737                                        (STp->buffer)->b_data[10] * 256 +
2738                                        (STp->buffer)->b_data[11]);
2739                         if (cmd_in == MTSETDENSITY || cmd_in == SET_DENS_AND_BLK)
2740                                 printk(ST_DEB_MSG
2741                                        "%s: Setting density code to %x.\n", name,
2742                                        (STp->buffer)->b_data[4]);
2743                         if (cmd_in == MTSETDRVBUFFER)
2744                                 printk(ST_DEB_MSG
2745                                        "%s: Setting drive buffer code to %d.\n", name,
2746                                     ((STp->buffer)->b_data[2] >> 4) & 7);
2747                 )
2748                 break;
2749         default:
2750                 return (-ENOSYS);
2751         }
2752
2753         SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction,
2754                            timeout, MAX_RETRIES, 1);
2755         if (!SRpnt)
2756                 return (STp->buffer)->syscall_result;
2757
2758         ioctl_result = (STp->buffer)->syscall_result;
2759
2760         if (!ioctl_result) {    /* SCSI command successful */
2761                 st_release_request(SRpnt);
2762                 SRpnt = NULL;
2763                 STps->drv_block = blkno;
2764                 STps->drv_file = fileno;
2765                 STps->at_sm = at_sm;
2766
2767                 if (cmd_in == MTBSFM)
2768                         ioctl_result = st_int_ioctl(STp, MTFSF, 1);
2769                 else if (cmd_in == MTFSFM)
2770                         ioctl_result = st_int_ioctl(STp, MTBSF, 1);
2771
2772                 if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2773                         int old_block_size = STp->block_size;
2774                         STp->block_size = arg & MT_ST_BLKSIZE_MASK;
2775                         if (STp->block_size != 0) {
2776                                 if (old_block_size == 0)
2777                                         normalize_buffer(STp->buffer);
2778                                 (STp->buffer)->buffer_blocks =
2779                                     (STp->buffer)->buffer_size / STp->block_size;
2780                         }
2781                         (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
2782                         if (cmd_in == SET_DENS_AND_BLK)
2783                                 STp->density = arg >> MT_ST_DENSITY_SHIFT;
2784                 } else if (cmd_in == MTSETDRVBUFFER)
2785                         STp->drv_buffer = (arg & 7);
2786                 else if (cmd_in == MTSETDENSITY)
2787                         STp->density = arg;
2788
2789                 if (cmd_in == MTEOM)
2790                         STps->eof = ST_EOD;
2791                 else if (cmd_in == MTFSF)
2792                         STps->eof = ST_FM;
2793                 else if (chg_eof)
2794                         STps->eof = ST_NOEOF;
2795
2796                 if (cmd_in == MTWEOF)
2797                         STps->rw = ST_IDLE;
2798         } else { /* SCSI command was not completely successful. Don't return
2799                     from this block without releasing the SCSI command block! */
2800                 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
2801
2802                 if (cmdstatp->flags & SENSE_EOM) {
2803                         if (cmd_in != MTBSF && cmd_in != MTBSFM &&
2804                             cmd_in != MTBSR && cmd_in != MTBSS)
2805                                 STps->eof = ST_EOM_OK;
2806                         STps->drv_block = 0;
2807                 }
2808
2809                 if (cmdstatp->remainder_valid)
2810                         undone = (int)cmdstatp->uremainder64;
2811                 else
2812                         undone = 0;
2813
2814                 if (cmd_in == MTWEOF &&
2815                     cmdstatp->have_sense &&
2816                     (cmdstatp->flags & SENSE_EOM) &&
2817                     (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
2818                      cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
2819                     undone == 0) {
2820                         ioctl_result = 0;       /* EOF written successfully at EOM */
2821                         if (fileno >= 0)
2822                                 fileno++;
2823                         STps->drv_file = fileno;
2824                         STps->eof = ST_NOEOF;
2825                 } else if ((cmd_in == MTFSF) || (cmd_in == MTFSFM)) {
2826                         if (fileno >= 0)
2827                                 STps->drv_file = fileno - undone;
2828                         else
2829                                 STps->drv_file = fileno;
2830                         STps->drv_block = -1;
2831                         STps->eof = ST_NOEOF;
2832                 } else if ((cmd_in == MTBSF) || (cmd_in == MTBSFM)) {
2833                         if (arg > 0 && undone < 0)  /* Some drives get this wrong */
2834                                 undone = (-undone);
2835                         if (STps->drv_file >= 0)
2836                                 STps->drv_file = fileno + undone;
2837                         STps->drv_block = 0;
2838                         STps->eof = ST_NOEOF;
2839                 } else if (cmd_in == MTFSR) {
2840                         if (cmdstatp->flags & SENSE_FMK) {      /* Hit filemark */
2841                                 if (STps->drv_file >= 0)
2842                                         STps->drv_file++;
2843                                 STps->drv_block = 0;
2844                                 STps->eof = ST_FM;
2845                         } else {
2846                                 if (blkno >= undone)
2847                                         STps->drv_block = blkno - undone;
2848                                 else
2849                                         STps->drv_block = (-1);
2850                                 STps->eof = ST_NOEOF;
2851                         }
2852                 } else if (cmd_in == MTBSR) {
2853                         if (cmdstatp->flags & SENSE_FMK) {      /* Hit filemark */
2854                                 STps->drv_file--;
2855                                 STps->drv_block = (-1);
2856                         } else {
2857                                 if (arg > 0 && undone < 0)  /* Some drives get this wrong */
2858                                         undone = (-undone);
2859                                 if (STps->drv_block >= 0)
2860                                         STps->drv_block = blkno + undone;
2861                         }
2862                         STps->eof = ST_NOEOF;
2863                 } else if (cmd_in == MTEOM) {
2864                         STps->drv_file = (-1);
2865                         STps->drv_block = (-1);
2866                         STps->eof = ST_EOD;
2867                 } else if (cmd_in == MTSETBLK ||
2868                            cmd_in == MTSETDENSITY ||
2869                            cmd_in == MTSETDRVBUFFER ||
2870                            cmd_in == SET_DENS_AND_BLK) {
2871                         if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST &&
2872                             !(STp->use_pf & PF_TESTED)) {
2873                                 /* Try the other possible state of Page Format if not
2874                                    already tried */
2875                                 STp->use_pf = !STp->use_pf | PF_TESTED;
2876                                 st_release_request(SRpnt);
2877                                 SRpnt = NULL;
2878                                 return st_int_ioctl(STp, cmd_in, arg);
2879                         }
2880                 } else if (chg_eof)
2881                         STps->eof = ST_NOEOF;
2882
2883                 if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
2884                         STps->eof = ST_EOD;
2885
2886                 st_release_request(SRpnt);
2887                 SRpnt = NULL;
2888         }
2889
2890         return ioctl_result;
2891 }
2892 \f
2893
2894 /* Get the tape position. If bt == 2, arg points into a kernel space mt_loc
2895    structure. */
2896
2897 static int get_location(struct scsi_tape *STp, unsigned int *block, int *partition,
2898                         int logical)
2899 {
2900         int result;
2901         unsigned char scmd[MAX_COMMAND_SIZE];
2902         struct st_request *SRpnt;
2903         DEB( char *name = tape_name(STp); )
2904
2905         if (STp->ready != ST_READY)
2906                 return (-EIO);
2907
2908         memset(scmd, 0, MAX_COMMAND_SIZE);
2909         if ((STp->device)->scsi_level < SCSI_2) {
2910                 scmd[0] = QFA_REQUEST_BLOCK;
2911                 scmd[4] = 3;
2912         } else {
2913                 scmd[0] = READ_POSITION;
2914                 if (!logical && !STp->scsi2_logical)
2915                         scmd[1] = 1;
2916         }
2917         SRpnt = st_do_scsi(NULL, STp, scmd, 20, DMA_FROM_DEVICE,
2918                         STp->device->timeout, MAX_READY_RETRIES, 1);
2919         if (!SRpnt)
2920                 return (STp->buffer)->syscall_result;
2921
2922         if ((STp->buffer)->syscall_result != 0 ||
2923             (STp->device->scsi_level >= SCSI_2 &&
2924              ((STp->buffer)->b_data[0] & 4) != 0)) {
2925                 *block = *partition = 0;
2926                 DEBC(printk(ST_DEB_MSG "%s: Can't read tape position.\n", name));
2927                 result = (-EIO);
2928         } else {
2929                 result = 0;
2930                 if ((STp->device)->scsi_level < SCSI_2) {
2931                         *block = ((STp->buffer)->b_data[0] << 16)
2932                             + ((STp->buffer)->b_data[1] << 8)
2933                             + (STp->buffer)->b_data[2];
2934                         *partition = 0;
2935                 } else {
2936                         *block = ((STp->buffer)->b_data[4] << 24)
2937                             + ((STp->buffer)->b_data[5] << 16)
2938                             + ((STp->buffer)->b_data[6] << 8)
2939                             + (STp->buffer)->b_data[7];
2940                         *partition = (STp->buffer)->b_data[1];
2941                         if (((STp->buffer)->b_data[0] & 0x80) &&
2942                             (STp->buffer)->b_data[1] == 0)      /* BOP of partition 0 */
2943                                 STp->ps[0].drv_block = STp->ps[0].drv_file = 0;
2944                 }
2945                 DEBC(printk(ST_DEB_MSG "%s: Got tape pos. blk %d part %d.\n", name,
2946                             *block, *partition));
2947         }
2948         st_release_request(SRpnt);
2949         SRpnt = NULL;
2950
2951         return result;
2952 }
2953
2954
2955 /* Set the tape block and partition. Negative partition means that only the
2956    block should be set in vendor specific way. */
2957 static int set_location(struct scsi_tape *STp, unsigned int block, int partition,
2958                         int logical)
2959 {
2960         struct st_partstat *STps;
2961         int result, p;
2962         unsigned int blk;
2963         int timeout;
2964         unsigned char scmd[MAX_COMMAND_SIZE];
2965         struct st_request *SRpnt;
2966         DEB( char *name = tape_name(STp); )
2967
2968         if (STp->ready != ST_READY)
2969                 return (-EIO);
2970         timeout = STp->long_timeout;
2971         STps = &(STp->ps[STp->partition]);
2972
2973         DEBC(printk(ST_DEB_MSG "%s: Setting block to %d and partition to %d.\n",
2974                     name, block, partition));
2975         DEB(if (partition < 0)
2976                 return (-EIO); )
2977
2978         /* Update the location at the partition we are leaving */
2979         if ((!STp->can_partitions && partition != 0) ||
2980             partition >= ST_NBR_PARTITIONS)
2981                 return (-EINVAL);
2982         if (partition != STp->partition) {
2983                 if (get_location(STp, &blk, &p, 1))
2984                         STps->last_block_valid = 0;
2985                 else {
2986                         STps->last_block_valid = 1;
2987                         STps->last_block_visited = blk;
2988                         DEBC(printk(ST_DEB_MSG
2989                                     "%s: Visited block %d for partition %d saved.\n",
2990                                     name, blk, STp->partition));
2991                 }
2992         }
2993
2994         memset(scmd, 0, MAX_COMMAND_SIZE);
2995         if ((STp->device)->scsi_level < SCSI_2) {
2996                 scmd[0] = QFA_SEEK_BLOCK;
2997                 scmd[2] = (block >> 16);
2998                 scmd[3] = (block >> 8);
2999                 scmd[4] = block;
3000                 scmd[5] = 0;
3001         } else {
3002                 scmd[0] = SEEK_10;
3003                 scmd[3] = (block >> 24);
3004                 scmd[4] = (block >> 16);
3005                 scmd[5] = (block >> 8);
3006                 scmd[6] = block;
3007                 if (!logical && !STp->scsi2_logical)
3008                         scmd[1] = 4;
3009                 if (STp->partition != partition) {
3010                         scmd[1] |= 2;
3011                         scmd[8] = partition;
3012                         DEBC(printk(ST_DEB_MSG
3013                                     "%s: Trying to change partition from %d to %d\n",
3014                                     name, STp->partition, partition));
3015                 }
3016         }
3017         if (STp->immediate) {
3018                 scmd[1] |= 1;           /* Don't wait for completion */
3019                 timeout = STp->device->timeout;
3020         }
3021
3022         SRpnt = st_do_scsi(NULL, STp, scmd, 0, DMA_NONE,
3023                            timeout, MAX_READY_RETRIES, 1);
3024         if (!SRpnt)
3025                 return (STp->buffer)->syscall_result;
3026
3027         STps->drv_block = STps->drv_file = (-1);
3028         STps->eof = ST_NOEOF;
3029         if ((STp->buffer)->syscall_result != 0) {
3030                 result = (-EIO);
3031                 if (STp->can_partitions &&
3032                     (STp->device)->scsi_level >= SCSI_2 &&
3033                     (p = find_partition(STp)) >= 0)
3034                         STp->partition = p;
3035         } else {
3036                 if (STp->can_partitions) {
3037                         STp->partition = partition;
3038                         STps = &(STp->ps[partition]);
3039                         if (!STps->last_block_valid ||
3040                             STps->last_block_visited != block) {
3041                                 STps->at_sm = 0;
3042                                 STps->rw = ST_IDLE;
3043                         }
3044                 } else
3045                         STps->at_sm = 0;
3046                 if (block == 0)
3047                         STps->drv_block = STps->drv_file = 0;
3048                 result = 0;
3049         }
3050
3051         st_release_request(SRpnt);
3052         SRpnt = NULL;
3053
3054         return result;
3055 }
3056
3057
3058 /* Find the current partition number for the drive status. Called from open and
3059    returns either partition number of negative error code. */
3060 static int find_partition(struct scsi_tape *STp)
3061 {
3062         int i, partition;
3063         unsigned int block;
3064
3065         if ((i = get_location(STp, &block, &partition, 1)) < 0)
3066                 return i;
3067         if (partition >= ST_NBR_PARTITIONS)
3068                 return (-EIO);
3069         return partition;
3070 }
3071
3072
3073 /* Change the partition if necessary */
3074 static int switch_partition(struct scsi_tape *STp)
3075 {
3076         struct st_partstat *STps;
3077
3078         if (STp->partition == STp->new_partition)
3079                 return 0;
3080         STps = &(STp->ps[STp->new_partition]);
3081         if (!STps->last_block_valid)
3082                 STps->last_block_visited = 0;
3083         return set_location(STp, STps->last_block_visited, STp->new_partition, 1);
3084 }
3085 \f
3086 /* Functions for reading and writing the medium partition mode page. */
3087
3088 #define PART_PAGE   0x11
3089 #define PART_PAGE_FIXED_LENGTH 8
3090
3091 #define PP_OFF_MAX_ADD_PARTS   2
3092 #define PP_OFF_NBR_ADD_PARTS   3
3093 #define PP_OFF_FLAGS           4
3094 #define PP_OFF_PART_UNITS      6
3095 #define PP_OFF_RESERVED        7
3096
3097 #define PP_BIT_IDP             0x20
3098 #define PP_MSK_PSUM_MB         0x10
3099
3100 /* Get the number of partitions on the tape. As a side effect reads the
3101    mode page into the tape buffer. */
3102 static int nbr_partitions(struct scsi_tape *STp)
3103 {
3104         int result;
3105         DEB( char *name = tape_name(STp); )
3106
3107         if (STp->ready != ST_READY)
3108                 return (-EIO);
3109
3110         result = read_mode_page(STp, PART_PAGE, 1);
3111
3112         if (result) {
3113                 DEBC(printk(ST_DEB_MSG "%s: Can't read medium partition page.\n",
3114                             name));
3115                 result = (-EIO);
3116         } else {
3117                 result = (STp->buffer)->b_data[MODE_HEADER_LENGTH +
3118                                               PP_OFF_NBR_ADD_PARTS] + 1;
3119                 DEBC(printk(ST_DEB_MSG "%s: Number of partitions %d.\n", name, result));
3120         }
3121
3122         return result;
3123 }
3124
3125
3126 /* Partition the tape into two partitions if size > 0 or one partition if
3127    size == 0.
3128
3129    The block descriptors are read and written because Sony SDT-7000 does not
3130    work without this (suggestion from Michael Schaefer <Michael.Schaefer@dlr.de>).
3131
3132    My HP C1533A drive returns only one partition size field. This is used to
3133    set the size of partition 1. There is no size field for the default partition.
3134    Michael Schaefer's Sony SDT-7000 returns two descriptors and the second is
3135    used to set the size of partition 1 (this is what the SCSI-3 standard specifies).
3136    The following algorithm is used to accommodate both drives: if the number of
3137    partition size fields is greater than the maximum number of additional partitions
3138    in the mode page, the second field is used. Otherwise the first field is used.
3139
3140    For Seagate DDS drives the page length must be 8 when no partitions is defined
3141    and 10 when 1 partition is defined (information from Eric Lee Green). This is
3142    is acceptable also to some other old drives and enforced if the first partition
3143    size field is used for the first additional partition size.
3144  */
3145 static int partition_tape(struct scsi_tape *STp, int size)
3146 {
3147         char *name = tape_name(STp);
3148         int result;
3149         int pgo, psd_cnt, psdo;
3150         unsigned char *bp;
3151
3152         result = read_mode_page(STp, PART_PAGE, 0);
3153         if (result) {
3154                 DEBC(printk(ST_DEB_MSG "%s: Can't read partition mode page.\n", name));
3155                 return result;
3156         }
3157         /* The mode page is in the buffer. Let's modify it and write it. */
3158         bp = (STp->buffer)->b_data;
3159         pgo = MODE_HEADER_LENGTH + bp[MH_OFF_BDESCS_LENGTH];
3160         DEBC(printk(ST_DEB_MSG "%s: Partition page length is %d bytes.\n",
3161                     name, bp[pgo + MP_OFF_PAGE_LENGTH] + 2));
3162
3163         psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2;
3164         psdo = pgo + PART_PAGE_FIXED_LENGTH;
3165         if (psd_cnt > bp[pgo + PP_OFF_MAX_ADD_PARTS]) {
3166                 bp[psdo] = bp[psdo + 1] = 0xff;  /* Rest of the tape */
3167                 psdo += 2;
3168         }
3169         memset(bp + psdo, 0, bp[pgo + PP_OFF_NBR_ADD_PARTS] * 2);
3170
3171         DEBC(printk("%s: psd_cnt %d, max.parts %d, nbr_parts %d\n", name,
3172                     psd_cnt, bp[pgo + PP_OFF_MAX_ADD_PARTS],
3173                     bp[pgo + PP_OFF_NBR_ADD_PARTS]));
3174
3175         if (size <= 0) {
3176                 bp[pgo + PP_OFF_NBR_ADD_PARTS] = 0;
3177                 if (psd_cnt <= bp[pgo + PP_OFF_MAX_ADD_PARTS])
3178                     bp[pgo + MP_OFF_PAGE_LENGTH] = 6;
3179                 DEBC(printk(ST_DEB_MSG "%s: Formatting tape with one partition.\n",
3180                             name));
3181         } else {
3182                 bp[psdo] = (size >> 8) & 0xff;
3183                 bp[psdo + 1] = size & 0xff;
3184                 bp[pgo + 3] = 1;
3185                 if (bp[pgo + MP_OFF_PAGE_LENGTH] < 8)
3186                     bp[pgo + MP_OFF_PAGE_LENGTH] = 8;
3187                 DEBC(printk(ST_DEB_MSG
3188                             "%s: Formatting tape with two partitions (1 = %d MB).\n",
3189                             name, size));
3190         }
3191         bp[pgo + PP_OFF_PART_UNITS] = 0;
3192         bp[pgo + PP_OFF_RESERVED] = 0;
3193         bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | PP_MSK_PSUM_MB;
3194
3195         result = write_mode_page(STp, PART_PAGE, 1);
3196         if (result) {
3197                 printk(KERN_INFO "%s: Partitioning of tape failed.\n", name);
3198                 result = (-EIO);
3199         }
3200
3201         return result;
3202 }
3203 \f
3204
3205
3206 /* The ioctl command */
3207 static int st_ioctl(struct inode *inode, struct file *file,
3208                     unsigned int cmd_in, unsigned long arg)
3209 {
3210         int i, cmd_nr, cmd_type, bt;
3211         int retval = 0;
3212         unsigned int blk;
3213         struct scsi_tape *STp = file->private_data;
3214         struct st_modedef *STm;
3215         struct st_partstat *STps;
3216         char *name = tape_name(STp);
3217         void __user *p = (void __user *)arg;
3218
3219         if (down_interruptible(&STp->lock))
3220                 return -ERESTARTSYS;
3221
3222         DEB(
3223         if (debugging && !STp->in_use) {
3224                 printk(ST_DEB_MSG "%s: Incorrect device.\n", name);
3225                 retval = (-EIO);
3226                 goto out;
3227         } ) /* end DEB */
3228
3229         STm = &(STp->modes[STp->current_mode]);
3230         STps = &(STp->ps[STp->partition]);
3231
3232         /*
3233          * If we are in the middle of error recovery, don't let anyone
3234          * else try and use this device.  Also, if error recovery fails, it
3235          * may try and take the device offline, in which case all further
3236          * access to the device is prohibited.
3237          */
3238         retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, file);
3239         if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV)
3240                 goto out;
3241         retval = 0;
3242
3243         cmd_type = _IOC_TYPE(cmd_in);
3244         cmd_nr = _IOC_NR(cmd_in);
3245
3246         if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
3247                 struct mtop mtc;
3248
3249                 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
3250                         retval = (-EINVAL);
3251                         goto out;
3252                 }
3253
3254                 i = copy_from_user(&mtc, p, sizeof(struct mtop));
3255                 if (i) {
3256                         retval = (-EFAULT);
3257                         goto out;
3258                 }
3259
3260                 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
3261                         printk(KERN_WARNING
3262                                "%s: MTSETDRVBUFFER only allowed for root.\n", name);
3263                         retval = (-EPERM);
3264                         goto out;
3265                 }
3266                 if (!STm->defined &&
3267                     (mtc.mt_op != MTSETDRVBUFFER &&
3268                      (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
3269                         retval = (-ENXIO);
3270                         goto out;
3271                 }
3272
3273                 if (!STp->pos_unknown) {
3274
3275                         if (STps->eof == ST_FM_HIT) {
3276                                 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
3277                                     mtc.mt_op == MTEOM) {
3278                                         mtc.mt_count -= 1;
3279                                         if (STps->drv_file >= 0)
3280                                                 STps->drv_file += 1;
3281                                 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
3282                                         mtc.mt_count += 1;
3283                                         if (STps->drv_file >= 0)
3284                                                 STps->drv_file += 1;
3285                                 }
3286                         }
3287
3288                         if (mtc.mt_op == MTSEEK) {
3289                                 /* Old position must be restored if partition will be
3290                                    changed */
3291                                 i = !STp->can_partitions ||
3292                                     (STp->new_partition != STp->partition);
3293                         } else {
3294                                 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
3295                                     mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
3296                                     mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
3297                                     mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
3298                                     mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
3299                                     mtc.mt_op == MTCOMPRESSION;
3300                         }
3301                         i = flush_buffer(STp, i);
3302                         if (i < 0) {
3303                                 retval = i;
3304                                 goto out;
3305                         }
3306                         if (STps->rw == ST_WRITING &&
3307                             (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
3308                              mtc.mt_op == MTSEEK ||
3309                              mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
3310                                 i = st_int_ioctl(STp, MTWEOF, 1);
3311                                 if (i < 0) {
3312                                         retval = i;
3313                                         goto out;
3314                                 }
3315                                 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
3316                                         mtc.mt_count++;
3317                                 STps->rw = ST_IDLE;
3318                              }
3319
3320                 } else {
3321                         /*
3322                          * If there was a bus reset, block further access
3323                          * to this device.  If the user wants to rewind the tape,
3324                          * then reset the flag and allow access again.
3325                          */
3326                         if (mtc.mt_op != MTREW &&
3327                             mtc.mt_op != MTOFFL &&
3328                             mtc.mt_op != MTRETEN &&
3329                             mtc.mt_op != MTERASE &&
3330                             mtc.mt_op != MTSEEK &&
3331                             mtc.mt_op != MTEOM) {
3332                                 retval = (-EIO);
3333                                 goto out;
3334                         }
3335                         reset_state(STp);
3336                         /* remove this when the midlevel properly clears was_reset */
3337                         STp->device->was_reset = 0;
3338                 }
3339
3340                 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
3341                     mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
3342                     mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
3343                         STps->rw = ST_IDLE;     /* Prevent automatic WEOF and fsf */
3344
3345                 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
3346                         do_door_lock(STp, 0);   /* Ignore result! */
3347
3348                 if (mtc.mt_op == MTSETDRVBUFFER &&
3349                     (mtc.mt_count & MT_ST_OPTIONS) != 0) {
3350                         retval = st_set_options(STp, mtc.mt_count);
3351                         goto out;
3352                 }
3353
3354                 if (mtc.mt_op == MTSETPART) {
3355                         if (!STp->can_partitions ||
3356                             mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
3357                                 retval = (-EINVAL);
3358                                 goto out;
3359                         }
3360                         if (mtc.mt_count >= STp->nbr_partitions &&
3361                             (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
3362                                 retval = (-EIO);
3363                                 goto out;
3364                         }
3365                         if (mtc.mt_count >= STp->nbr_partitions) {
3366                                 retval = (-EINVAL);
3367                                 goto out;
3368                         }
3369                         STp->new_partition = mtc.mt_count;
3370                         retval = 0;
3371                         goto out;
3372                 }
3373
3374                 if (mtc.mt_op == MTMKPART) {
3375                         if (!STp->can_partitions) {
3376                                 retval = (-EINVAL);
3377                                 goto out;
3378                         }
3379                         if ((i = st_int_ioctl(STp, MTREW, 0)) < 0 ||
3380                             (i = partition_tape(STp, mtc.mt_count)) < 0) {
3381                                 retval = i;
3382                                 goto out;
3383                         }
3384                         for (i = 0; i < ST_NBR_PARTITIONS; i++) {
3385                                 STp->ps[i].rw = ST_IDLE;
3386                                 STp->ps[i].at_sm = 0;
3387                                 STp->ps[i].last_block_valid = 0;
3388                         }
3389                         STp->partition = STp->new_partition = 0;
3390                         STp->nbr_partitions = 1;        /* Bad guess ?-) */
3391                         STps->drv_block = STps->drv_file = 0;
3392                         retval = 0;
3393                         goto out;
3394                 }
3395
3396                 if (mtc.mt_op == MTSEEK) {
3397                         i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
3398                         if (!STp->can_partitions)
3399                                 STp->ps[0].rw = ST_IDLE;
3400                         retval = i;
3401                         goto out;
3402                 }
3403
3404                 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
3405                         retval = do_load_unload(STp, file, 0);
3406                         goto out;
3407                 }
3408
3409                 if (mtc.mt_op == MTLOAD) {
3410                         retval = do_load_unload(STp, file, max(1, mtc.mt_count));
3411                         goto out;
3412                 }
3413
3414                 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
3415                         retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
3416                         goto out;
3417                 }
3418
3419                 if (STp->can_partitions && STp->ready == ST_READY &&
3420                     (i = switch_partition(STp)) < 0) {
3421                         retval = i;
3422                         goto out;
3423                 }
3424
3425                 if (mtc.mt_op == MTCOMPRESSION)
3426                         retval = st_compression(STp, (mtc.mt_count & 1));
3427                 else
3428                         retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
3429                 goto out;
3430         }
3431         if (!STm->defined) {
3432                 retval = (-ENXIO);
3433                 goto out;
3434         }
3435
3436         if ((i = flush_buffer(STp, 0)) < 0) {
3437                 retval = i;
3438                 goto out;
3439         }
3440         if (STp->can_partitions &&
3441             (i = switch_partition(STp)) < 0) {
3442                 retval = i;
3443                 goto out;
3444         }
3445
3446         if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) {
3447                 struct mtget mt_status;
3448
3449                 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
3450                          retval = (-EINVAL);
3451                          goto out;
3452                 }
3453
3454                 mt_status.mt_type = STp->tape_type;
3455                 mt_status.mt_dsreg =
3456                     ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
3457                     ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
3458                 mt_status.mt_blkno = STps->drv_block;
3459                 mt_status.mt_fileno = STps->drv_file;
3460                 if (STp->block_size != 0) {
3461                         if (STps->rw == ST_WRITING)
3462                                 mt_status.mt_blkno +=
3463                                     (STp->buffer)->buffer_bytes / STp->block_size;
3464                         else if (STps->rw == ST_READING)
3465                                 mt_status.mt_blkno -=
3466                                         ((STp->buffer)->buffer_bytes +
3467                                          STp->block_size - 1) / STp->block_size;
3468                 }
3469
3470                 mt_status.mt_gstat = 0;
3471                 if (STp->drv_write_prot)
3472                         mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
3473                 if (mt_status.mt_blkno == 0) {
3474                         if (mt_status.mt_fileno == 0)
3475                                 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
3476                         else
3477                                 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
3478                 }
3479                 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
3480                 mt_status.mt_resid = STp->partition;
3481                 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
3482                         mt_status.mt_gstat |= GMT_EOT(0xffffffff);
3483                 else if (STps->eof >= ST_EOM_OK)
3484                         mt_status.mt_gstat |= GMT_EOD(0xffffffff);
3485                 if (STp->density == 1)
3486                         mt_status.mt_gstat |= GMT_D_800(0xffffffff);
3487                 else if (STp->density == 2)
3488                         mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
3489                 else if (STp->density == 3)
3490                         mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
3491                 if (STp->ready == ST_READY)
3492                         mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
3493                 if (STp->ready == ST_NO_TAPE)
3494                         mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
3495                 if (STps->at_sm)
3496                         mt_status.mt_gstat |= GMT_SM(0xffffffff);
3497                 if (STm->do_async_writes ||
3498                     (STm->do_buffer_writes && STp->block_size != 0) ||
3499                     STp->drv_buffer != 0)
3500                         mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
3501                 if (STp->cleaning_req)
3502                         mt_status.mt_gstat |= GMT_CLN(0xffffffff);
3503
3504                 i = copy_to_user(p, &mt_status, sizeof(struct mtget));
3505                 if (i) {
3506                         retval = (-EFAULT);
3507                         goto out;
3508                 }
3509
3510                 STp->recover_reg = 0;           /* Clear after read */
3511                 retval = 0;
3512                 goto out;
3513         }                       /* End of MTIOCGET */
3514         if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
3515                 struct mtpos mt_pos;
3516                 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
3517                          retval = (-EINVAL);
3518                          goto out;
3519                 }
3520                 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
3521                         retval = i;
3522                         goto out;
3523                 }
3524                 mt_pos.mt_blkno = blk;
3525                 i = copy_to_user(p, &mt_pos, sizeof(struct mtpos));
3526                 if (i)
3527                         retval = (-EFAULT);
3528                 goto out;
3529         }
3530         up(&STp->lock);
3531         switch (cmd_in) {
3532                 case SCSI_IOCTL_GET_IDLUN:
3533                 case SCSI_IOCTL_GET_BUS_NUMBER:
3534                         break;
3535                 default:
3536                         if ((cmd_in == SG_IO ||
3537                              cmd_in == SCSI_IOCTL_SEND_COMMAND ||
3538                              cmd_in == CDROM_SEND_PACKET) &&
3539                             !capable(CAP_SYS_RAWIO))
3540                                 i = -EPERM;
3541                         else
3542                                 i = scsi_cmd_ioctl(file, STp->disk, cmd_in, p);
3543                         if (i != -ENOTTY)
3544                                 return i;
3545                         break;
3546         }
3547         retval = scsi_ioctl(STp->device, cmd_in, p);
3548         if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) { /* unload */
3549                 STp->rew_at_close = 0;
3550                 STp->ready = ST_NO_TAPE;
3551         }
3552         return retval;
3553
3554  out:
3555         up(&STp->lock);
3556         return retval;
3557 }
3558
3559 #ifdef CONFIG_COMPAT
3560 static long st_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3561 {
3562         struct scsi_tape *STp = file->private_data;
3563         struct scsi_device *sdev = STp->device;
3564         int ret = -ENOIOCTLCMD;
3565         if (sdev->host->hostt->compat_ioctl) { 
3566
3567                 ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
3568
3569         }
3570         return ret;
3571 }
3572 #endif
3573
3574 \f
3575
3576 /* Try to allocate a new tape buffer. Calling function must not hold
3577    dev_arr_lock. */
3578 static struct st_buffer *
3579  new_tape_buffer(int from_initialization, int need_dma, int max_sg)
3580 {
3581         int i, got = 0;
3582         gfp_t priority;
3583         struct st_buffer *tb;
3584
3585         if (from_initialization)
3586                 priority = GFP_ATOMIC;
3587         else
3588                 priority = GFP_KERNEL;
3589
3590         i = sizeof(struct st_buffer) + (max_sg - 1) * sizeof(struct scatterlist) +
3591                 max_sg * sizeof(struct st_buf_fragment);
3592         tb = kzalloc(i, priority);
3593         if (!tb) {
3594                 printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n");
3595                 return NULL;
3596         }
3597         tb->frp_segs = tb->orig_frp_segs = 0;
3598         tb->use_sg = max_sg;
3599         tb->frp = (struct st_buf_fragment *)(&(tb->sg[0]) + max_sg);
3600
3601         tb->dma = need_dma;
3602         tb->buffer_size = got;
3603
3604         return tb;
3605 }
3606
3607
3608 /* Try to allocate enough space in the tape buffer */
3609 static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma)
3610 {
3611         int segs, nbr, max_segs, b_size, order, got;
3612         gfp_t priority;
3613
3614         if (new_size <= STbuffer->buffer_size)
3615                 return 1;
3616
3617         if (STbuffer->buffer_size <= PAGE_SIZE)
3618                 normalize_buffer(STbuffer);  /* Avoid extra segment */
3619
3620         max_segs = STbuffer->use_sg;
3621         nbr = max_segs - STbuffer->frp_segs;
3622         if (nbr <= 0)
3623                 return 0;
3624
3625         priority = GFP_KERNEL | __GFP_NOWARN;
3626         if (need_dma)
3627                 priority |= GFP_DMA;
3628         for (b_size = PAGE_SIZE, order=0; order <= 6 &&
3629              b_size < new_size - STbuffer->buffer_size;
3630              order++, b_size *= 2)
3631                 ;  /* empty */
3632
3633         for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
3634              segs < max_segs && got < new_size;) {
3635                 STbuffer->frp[segs].page = alloc_pages(priority, order);
3636                 if (STbuffer->frp[segs].page == NULL) {
3637                         if (new_size - got <= (max_segs - segs) * b_size / 2) {
3638                                 b_size /= 2; /* Large enough for the rest of the buffers */
3639                                 order--;
3640                                 continue;
3641                         }
3642                         DEB(STbuffer->buffer_size = got);
3643                         normalize_buffer(STbuffer);
3644                         return 0;
3645                 }
3646                 STbuffer->frp[segs].length = b_size;
3647                 STbuffer->frp_segs += 1;
3648                 got += b_size;
3649                 STbuffer->buffer_size = got;
3650                 segs++;
3651         }
3652         STbuffer->b_data = page_address(STbuffer->frp[0].page);
3653
3654         return 1;
3655 }
3656
3657
3658 /* Release the extra buffer */
3659 static void normalize_buffer(struct st_buffer * STbuffer)
3660 {
3661         int i, order;
3662
3663         for (i = STbuffer->orig_frp_segs; i < STbuffer->frp_segs; i++) {
3664                 order = get_order(STbuffer->frp[i].length);
3665                 __free_pages(STbuffer->frp[i].page, order);
3666                 STbuffer->buffer_size -= STbuffer->frp[i].length;
3667         }
3668         STbuffer->frp_segs = STbuffer->orig_frp_segs;
3669         STbuffer->frp_sg_current = 0;
3670         STbuffer->sg_segs = 0;
3671 }
3672
3673
3674 /* Move data from the user buffer to the tape buffer. Returns zero (success) or
3675    negative error code. */
3676 static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count)
3677 {
3678         int i, cnt, res, offset;
3679
3680         for (i = 0, offset = st_bp->buffer_bytes;
3681              i < st_bp->frp_segs && offset >= st_bp->frp[i].length; i++)
3682                 offset -= st_bp->frp[i].length;
3683         if (i == st_bp->frp_segs) {     /* Should never happen */
3684                 printk(KERN_WARNING "st: append_to_buffer offset overflow.\n");
3685                 return (-EIO);
3686         }
3687         for (; i < st_bp->frp_segs && do_count > 0; i++) {
3688                 cnt = st_bp->frp[i].length - offset < do_count ?
3689                     st_bp->frp[i].length - offset : do_count;
3690                 res = copy_from_user(page_address(st_bp->frp[i].page) + offset, ubp, cnt);
3691                 if (res)
3692                         return (-EFAULT);
3693                 do_count -= cnt;
3694                 st_bp->buffer_bytes += cnt;
3695                 ubp += cnt;
3696                 offset = 0;
3697         }
3698         if (do_count) /* Should never happen */
3699                 return (-EIO);
3700
3701         return 0;
3702 }
3703
3704
3705 /* Move data from the tape buffer to the user buffer. Returns zero (success) or
3706    negative error code. */
3707 static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count)
3708 {
3709         int i, cnt, res, offset;
3710
3711         for (i = 0, offset = st_bp->read_pointer;
3712              i < st_bp->frp_segs && offset >= st_bp->frp[i].length; i++)
3713                 offset -= st_bp->frp[i].length;
3714         if (i == st_bp->frp_segs) {     /* Should never happen */
3715                 printk(KERN_WARNING "st: from_buffer offset overflow.\n");
3716                 return (-EIO);
3717         }
3718         for (; i < st_bp->frp_segs && do_count > 0; i++) {
3719                 cnt = st_bp->frp[i].length - offset < do_count ?
3720                     st_bp->frp[i].length - offset : do_count;
3721                 res = copy_to_user(ubp, page_address(st_bp->frp[i].page) + offset, cnt);
3722                 if (res)
3723                         return (-EFAULT);
3724                 do_count -= cnt;
3725                 st_bp->buffer_bytes -= cnt;
3726                 st_bp->read_pointer += cnt;
3727                 ubp += cnt;
3728                 offset = 0;
3729         }
3730         if (do_count) /* Should never happen */
3731                 return (-EIO);
3732
3733         return 0;
3734 }
3735
3736
3737 /* Move data towards start of buffer */
3738 static void move_buffer_data(struct st_buffer * st_bp, int offset)
3739 {
3740         int src_seg, dst_seg, src_offset = 0, dst_offset;
3741         int count, total;
3742
3743         if (offset == 0)
3744                 return;
3745
3746         total=st_bp->buffer_bytes - offset;
3747         for (src_seg=0; src_seg < st_bp->frp_segs; src_seg++) {
3748                 src_offset = offset;
3749                 if (src_offset < st_bp->frp[src_seg].length)
3750                         break;
3751                 offset -= st_bp->frp[src_seg].length;
3752         }
3753
3754         st_bp->buffer_bytes = st_bp->read_pointer = total;
3755         for (dst_seg=dst_offset=0; total > 0; ) {
3756                 count = min(st_bp->frp[dst_seg].length - dst_offset,
3757                             st_bp->frp[src_seg].length - src_offset);
3758                 memmove(page_address(st_bp->frp[dst_seg].page) + dst_offset,
3759                         page_address(st_bp->frp[src_seg].page) + src_offset, count);
3760                 src_offset += count;
3761                 if (src_offset >= st_bp->frp[src_seg].length) {
3762                         src_seg++;
3763                         src_offset = 0;
3764                 }
3765                 dst_offset += count;
3766                 if (dst_offset >= st_bp->frp[dst_seg].length) {
3767                         dst_seg++;
3768                         dst_offset = 0;
3769                 }
3770                 total -= count;
3771         }
3772 }
3773
3774
3775 /* Fill the s/g list up to the length required for this transfer */
3776 static void buf_to_sg(struct st_buffer *STbp, unsigned int length)
3777 {
3778         int i;
3779         unsigned int count;
3780         struct scatterlist *sg;
3781         struct st_buf_fragment *frp;
3782
3783         if (length == STbp->frp_sg_current)
3784                 return;   /* work already done */
3785
3786         sg = &(STbp->sg[0]);
3787         frp = STbp->frp;
3788         for (i=count=0; count < length; i++) {
3789                 sg[i].page = frp[i].page;
3790                 if (length - count > frp[i].length)
3791                         sg[i].length = frp[i].length;
3792                 else
3793                         sg[i].length = length - count;
3794                 count += sg[i].length;
3795                 sg[i].offset = 0;
3796         }
3797         STbp->sg_segs = i;
3798         STbp->frp_sg_current = length;
3799 }
3800
3801
3802 /* Validate the options from command line or module parameters */
3803 static void validate_options(void)
3804 {
3805         if (buffer_kbs > 0)
3806                 st_fixed_buffer_size = buffer_kbs * ST_KILOBYTE;
3807         if (max_sg_segs >= ST_FIRST_SG)
3808                 st_max_sg_segs = max_sg_segs;
3809 }
3810
3811 #ifndef MODULE
3812 /* Set the boot options. Syntax is defined in Documenation/scsi/st.txt.
3813  */
3814 static int __init st_setup(char *str)
3815 {
3816         int i, len, ints[5];
3817         char *stp;
3818
3819         stp = get_options(str, ARRAY_SIZE(ints), ints);
3820
3821         if (ints[0] > 0) {
3822                 for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++)
3823                         if (parms[i].val)
3824                                 *parms[i].val = ints[i + 1];
3825         } else {
3826                 while (stp != NULL) {
3827                         for (i = 0; i < ARRAY_SIZE(parms); i++) {
3828                                 len = strlen(parms[i].name);
3829                                 if (!strncmp(stp, parms[i].name, len) &&
3830                                     (*(stp + len) == ':' || *(stp + len) == '=')) {
3831                                         if (parms[i].val)
3832                                                 *parms[i].val =
3833                                                         simple_strtoul(stp + len + 1, NULL, 0);
3834                                         else
3835                                                 printk(KERN_WARNING "st: Obsolete parameter %s\n",
3836                                                        parms[i].name);
3837                                         break;
3838                                 }
3839                         }
3840                         if (i >= ARRAY_SIZE(parms))
3841                                  printk(KERN_WARNING "st: invalid parameter in '%s'\n",
3842                                         stp);
3843                         stp = strchr(stp, ',');
3844                         if (stp)
3845                                 stp++;
3846                 }
3847         }
3848
3849         validate_options();
3850
3851         return 1;
3852 }
3853
3854 __setup("st=", st_setup);
3855
3856 #endif
3857
3858 static struct file_operations st_fops =
3859 {
3860         .owner =        THIS_MODULE,
3861         .read =         st_read,
3862         .write =        st_write,
3863         .ioctl =        st_ioctl,
3864 #ifdef CONFIG_COMPAT
3865         .compat_ioctl = st_compat_ioctl,
3866 #endif
3867         .open =         st_open,
3868         .flush =        st_flush,
3869         .release =      st_release,
3870 };
3871
3872 static int st_probe(struct device *dev)
3873 {
3874         struct scsi_device *SDp = to_scsi_device(dev);
3875         struct gendisk *disk = NULL;
3876         struct cdev *cdev = NULL;
3877         struct scsi_tape *tpnt = NULL;
3878         struct st_modedef *STm;
3879         struct st_partstat *STps;
3880         struct st_buffer *buffer;
3881         int i, j, mode, dev_num, error;
3882         char *stp;
3883
3884         if (SDp->type != TYPE_TAPE)
3885                 return -ENODEV;
3886         if ((stp = st_incompatible(SDp))) {
3887                 sdev_printk(KERN_INFO, SDp, "Found incompatible tape\n");
3888                 printk(KERN_INFO "st: The suggested driver is %s.\n", stp);
3889                 return -ENODEV;
3890         }
3891
3892         i = min(SDp->request_queue->max_hw_segments,
3893                 SDp->request_queue->max_phys_segments);
3894         if (st_max_sg_segs < i)
3895                 i = st_max_sg_segs;
3896         buffer = new_tape_buffer(1, (SDp->host)->unchecked_isa_dma, i);
3897         if (buffer == NULL) {
3898                 printk(KERN_ERR
3899                        "st: Can't allocate new tape buffer. Device not attached.\n");
3900                 goto out;
3901         }
3902
3903         disk = alloc_disk(1);
3904         if (!disk) {
3905                 printk(KERN_ERR "st: out of memory. Device not attached.\n");
3906                 goto out_buffer_free;
3907         }
3908
3909         write_lock(&st_dev_arr_lock);
3910         if (st_nr_dev >= st_dev_max) {
3911                 struct scsi_tape **tmp_da;
3912                 int tmp_dev_max;
3913
3914                 tmp_dev_max = max(st_nr_dev * 2, 8);
3915                 if (tmp_dev_max > ST_MAX_TAPES)
3916                         tmp_dev_max = ST_MAX_TAPES;
3917                 if (tmp_dev_max <= st_nr_dev) {
3918                         write_unlock(&st_dev_arr_lock);
3919                         printk(KERN_ERR "st: Too many tape devices (max. %d).\n",
3920                                ST_MAX_TAPES);
3921                         goto out_put_disk;
3922                 }
3923
3924                 tmp_da = kzalloc(tmp_dev_max * sizeof(struct scsi_tape *), GFP_ATOMIC);
3925                 if (tmp_da == NULL) {
3926                         write_unlock(&st_dev_arr_lock);
3927                         printk(KERN_ERR "st: Can't extend device array.\n");
3928                         goto out_put_disk;
3929                 }
3930
3931                 if (scsi_tapes != NULL) {
3932                         memcpy(tmp_da, scsi_tapes,
3933                                st_dev_max * sizeof(struct scsi_tape *));
3934                         kfree(scsi_tapes);
3935                 }
3936                 scsi_tapes = tmp_da;
3937
3938                 st_dev_max = tmp_dev_max;
3939         }
3940
3941         for (i = 0; i < st_dev_max; i++)
3942                 if (scsi_tapes[i] == NULL)
3943                         break;
3944         if (i >= st_dev_max)
3945                 panic("scsi_devices corrupt (st)");
3946
3947         tpnt = kzalloc(sizeof(struct scsi_tape), GFP_ATOMIC);
3948         if (tpnt == NULL) {
3949                 write_unlock(&st_dev_arr_lock);
3950                 printk(KERN_ERR "st: Can't allocate device descriptor.\n");
3951                 goto out_put_disk;
3952         }
3953         kref_init(&tpnt->kref);
3954         tpnt->disk = disk;
3955         sprintf(disk->disk_name, "st%d", i);
3956         disk->private_data = &tpnt->driver;
3957         disk->queue = SDp->request_queue;
3958         tpnt->driver = &st_template;
3959         scsi_tapes[i] = tpnt;
3960         dev_num = i;
3961
3962         tpnt->device = SDp;
3963         if (SDp->scsi_level <= 2)
3964                 tpnt->tape_type = MT_ISSCSI1;
3965         else
3966                 tpnt->tape_type = MT_ISSCSI2;
3967
3968         tpnt->buffer = buffer;
3969         tpnt->buffer->last_SRpnt = NULL;
3970
3971         tpnt->inited = 0;
3972         tpnt->dirty = 0;
3973         tpnt->in_use = 0;
3974         tpnt->drv_buffer = 1;   /* Try buffering if no mode sense */
3975         tpnt->restr_dma = (SDp->host)->unchecked_isa_dma;
3976         tpnt->use_pf = (SDp->scsi_level >= SCSI_2);
3977         tpnt->density = 0;
3978         tpnt->do_auto_lock = ST_AUTO_LOCK;
3979         tpnt->can_bsr = (SDp->scsi_level > 2 ? 1 : ST_IN_FILE_POS); /* BSR mandatory in SCSI3 */
3980         tpnt->can_partitions = 0;
3981         tpnt->two_fm = ST_TWO_FM;
3982         tpnt->fast_mteom = ST_FAST_MTEOM;
3983         tpnt->scsi2_logical = ST_SCSI2LOGICAL;
3984         tpnt->immediate = ST_NOWAIT;
3985         tpnt->default_drvbuffer = 0xff;         /* No forced buffering */
3986         tpnt->partition = 0;
3987         tpnt->new_partition = 0;
3988         tpnt->nbr_partitions = 0;
3989         tpnt->device->timeout = ST_TIMEOUT;
3990         tpnt->long_timeout = ST_LONG_TIMEOUT;
3991         tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma;
3992
3993         for (i = 0; i < ST_NBR_MODES; i++) {
3994                 STm = &(tpnt->modes[i]);
3995                 STm->defined = 0;
3996                 STm->sysv = ST_SYSV;
3997                 STm->defaults_for_writes = 0;
3998                 STm->do_async_writes = ST_ASYNC_WRITES;
3999                 STm->do_buffer_writes = ST_BUFFER_WRITES;
4000                 STm->do_read_ahead = ST_READ_AHEAD;
4001                 STm->default_compression = ST_DONT_TOUCH;
4002                 STm->default_blksize = (-1);    /* No forced size */
4003                 STm->default_density = (-1);    /* No forced density */
4004         }
4005
4006         for (i = 0; i < ST_NBR_PARTITIONS; i++) {
4007                 STps = &(tpnt->ps[i]);
4008                 STps->rw = ST_IDLE;
4009                 STps->eof = ST_NOEOF;
4010                 STps->at_sm = 0;
4011                 STps->last_block_valid = 0;
4012                 STps->drv_block = (-1);
4013                 STps->drv_file = (-1);
4014         }
4015
4016         tpnt->current_mode = 0;
4017         tpnt->modes[0].defined = 1;
4018
4019         tpnt->density_changed = tpnt->compression_changed =
4020             tpnt->blksize_changed = 0;
4021         init_MUTEX(&tpnt->lock);
4022
4023         st_nr_dev++;
4024         write_unlock(&st_dev_arr_lock);
4025
4026         for (mode = 0; mode < ST_NBR_MODES; ++mode) {
4027                 STm = &(tpnt->modes[mode]);
4028                 for (j=0; j < 2; j++) {
4029                         cdev = cdev_alloc();
4030                         if (!cdev) {
4031                                 printk(KERN_ERR
4032                                        "st%d: out of memory. Device not attached.\n",
4033                                        dev_num);
4034                                 goto out_free_tape;
4035                         }
4036                         cdev->owner = THIS_MODULE;
4037                         cdev->ops = &st_fops;
4038
4039                         error = cdev_add(cdev,
4040                                          MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, j)),
4041                                          1);
4042                         if (error) {
4043                                 printk(KERN_ERR "st%d: Can't add %s-rewind mode %d\n",
4044                                        dev_num, j ? "non" : "auto", mode);
4045                                 printk(KERN_ERR "st%d: Device not attached.\n", dev_num);
4046                                 goto out_free_tape;
4047                         }
4048                         STm->cdevs[j] = cdev;
4049
4050                 }
4051                 do_create_class_files(tpnt, dev_num, mode);
4052         }
4053
4054         sdev_printk(KERN_WARNING, SDp,
4055                     "Attached scsi tape %s\n", tape_name(tpnt));
4056         printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B)\n",
4057                tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
4058                queue_dma_alignment(SDp->request_queue) + 1);
4059
4060         return 0;
4061
4062 out_free_tape:
4063         for (mode=0; mode < ST_NBR_MODES; mode++) {
4064                 STm = &(tpnt->modes[mode]);
4065                 sysfs_remove_link(&tpnt->device->sdev_gendev.kobj,
4066                                   "tape");
4067                 for (j=0; j < 2; j++) {
4068                         if (STm->cdevs[j]) {
4069                                 if (cdev == STm->cdevs[j])
4070                                         cdev = NULL;
4071                                 class_device_destroy(st_sysfs_class,
4072                                                      MKDEV(SCSI_TAPE_MAJOR,
4073                                                            TAPE_MINOR(i, mode, j)));
4074                                 cdev_del(STm->cdevs[j]);
4075                         }
4076                 }
4077         }
4078         if (cdev)
4079                 cdev_del(cdev);
4080         write_lock(&st_dev_arr_lock);
4081         scsi_tapes[dev_num] = NULL;
4082         st_nr_dev--;
4083         write_unlock(&st_dev_arr_lock);
4084 out_put_disk:
4085         put_disk(disk);
4086         kfree(tpnt);
4087 out_buffer_free:
4088         kfree(buffer);
4089 out:
4090         return -ENODEV;
4091 };
4092
4093
4094 static int st_remove(struct device *dev)
4095 {
4096         struct scsi_device *SDp = to_scsi_device(dev);
4097         struct scsi_tape *tpnt;
4098         int i, j, mode;
4099
4100         write_lock(&st_dev_arr_lock);
4101         for (i = 0; i < st_dev_max; i++) {
4102                 tpnt = scsi_tapes[i];
4103                 if (tpnt != NULL && tpnt->device == SDp) {
4104                         scsi_tapes[i] = NULL;
4105                         st_nr_dev--;
4106                         write_unlock(&st_dev_arr_lock);
4107                         sysfs_remove_link(&tpnt->device->sdev_gendev.kobj,
4108                                           "tape");
4109                         for (mode = 0; mode < ST_NBR_MODES; ++mode) {
4110                                 for (j=0; j < 2; j++) {
4111                                         class_device_destroy(st_sysfs_class,
4112                                                              MKDEV(SCSI_TAPE_MAJOR,
4113                                                                    TAPE_MINOR(i, mode, j)));
4114                                         cdev_del(tpnt->modes[mode].cdevs[j]);
4115                                         tpnt->modes[mode].cdevs[j] = NULL;
4116                                 }
4117                         }
4118
4119                         mutex_lock(&st_ref_mutex);
4120                         kref_put(&tpnt->kref, scsi_tape_release);
4121                         mutex_unlock(&st_ref_mutex);
4122                         return 0;
4123                 }
4124         }
4125
4126         write_unlock(&st_dev_arr_lock);
4127         return 0;
4128 }
4129
4130 /**
4131  *      scsi_tape_release - Called to free the Scsi_Tape structure
4132  *      @kref: pointer to embedded kref
4133  *
4134  *      st_ref_mutex must be held entering this routine.  Because it is
4135  *      called on last put, you should always use the scsi_tape_get()
4136  *      scsi_tape_put() helpers which manipulate the semaphore directly
4137  *      and never do a direct kref_put().
4138  **/
4139 static void scsi_tape_release(struct kref *kref)
4140 {
4141         struct scsi_tape *tpnt = to_scsi_tape(kref);
4142         struct gendisk *disk = tpnt->disk;
4143
4144         tpnt->device = NULL;
4145
4146         if (tpnt->buffer) {
4147                 tpnt->buffer->orig_frp_segs = 0;
4148                 normalize_buffer(tpnt->buffer);
4149                 kfree(tpnt->buffer);
4150         }
4151
4152         disk->private_data = NULL;
4153         put_disk(disk);
4154         kfree(tpnt);
4155         return;
4156 }
4157
4158 static int __init init_st(void)
4159 {
4160         validate_options();
4161
4162         printk(KERN_INFO
4163                 "st: Version %s, fixed bufsize %d, s/g segs %d\n",
4164                 verstr, st_fixed_buffer_size, st_max_sg_segs);
4165
4166         st_sysfs_class = class_create(THIS_MODULE, "scsi_tape");
4167         if (IS_ERR(st_sysfs_class)) {
4168                 st_sysfs_class = NULL;
4169                 printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n");
4170                 return 1;
4171         }
4172
4173         if (!register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4174                                     ST_MAX_TAPE_ENTRIES, "st")) {
4175                 if (scsi_register_driver(&st_template.gendrv) == 0) {
4176                         do_create_driverfs_files();
4177                         return 0;
4178                 }
4179                 unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4180                                          ST_MAX_TAPE_ENTRIES);
4181         }
4182         class_destroy(st_sysfs_class);
4183
4184         printk(KERN_ERR "Unable to get major %d for SCSI tapes\n", SCSI_TAPE_MAJOR);
4185         return 1;
4186 }
4187
4188 static void __exit exit_st(void)
4189 {
4190         do_remove_driverfs_files();
4191         scsi_unregister_driver(&st_template.gendrv);
4192         unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4193                                  ST_MAX_TAPE_ENTRIES);
4194         class_destroy(st_sysfs_class);
4195         kfree(scsi_tapes);
4196         printk(KERN_INFO "st: Unloaded.\n");
4197 }
4198
4199 module_init(init_st);
4200 module_exit(exit_st);
4201
4202
4203 /* The sysfs driver interface. Read-only at the moment */
4204 static ssize_t st_try_direct_io_show(struct device_driver *ddp, char *buf)
4205 {
4206         return snprintf(buf, PAGE_SIZE, "%d\n", try_direct_io);
4207 }
4208 static DRIVER_ATTR(try_direct_io, S_IRUGO, st_try_direct_io_show, NULL);
4209
4210 static ssize_t st_fixed_buffer_size_show(struct device_driver *ddp, char *buf)
4211 {
4212         return snprintf(buf, PAGE_SIZE, "%d\n", st_fixed_buffer_size);
4213 }
4214 static DRIVER_ATTR(fixed_buffer_size, S_IRUGO, st_fixed_buffer_size_show, NULL);
4215
4216 static ssize_t st_max_sg_segs_show(struct device_driver *ddp, char *buf)
4217 {
4218         return snprintf(buf, PAGE_SIZE, "%d\n", st_max_sg_segs);
4219 }
4220 static DRIVER_ATTR(max_sg_segs, S_IRUGO, st_max_sg_segs_show, NULL);
4221
4222 static ssize_t st_version_show(struct device_driver *ddd, char *buf)
4223 {
4224         return snprintf(buf, PAGE_SIZE, "[%s]\n", verstr);
4225 }
4226 static DRIVER_ATTR(version, S_IRUGO, st_version_show, NULL);
4227
4228 static void do_create_driverfs_files(void)
4229 {
4230         struct device_driver *driverfs = &st_template.gendrv;
4231
4232         driver_create_file(driverfs, &driver_attr_try_direct_io);
4233         driver_create_file(driverfs, &driver_attr_fixed_buffer_size);
4234         driver_create_file(driverfs, &driver_attr_max_sg_segs);
4235         driver_create_file(driverfs, &driver_attr_version);
4236 }
4237
4238 static void do_remove_driverfs_files(void)
4239 {
4240         struct device_driver *driverfs = &st_template.gendrv;
4241
4242         driver_remove_file(driverfs, &driver_attr_version);
4243         driver_remove_file(driverfs, &driver_attr_max_sg_segs);
4244         driver_remove_file(driverfs, &driver_attr_fixed_buffer_size);
4245         driver_remove_file(driverfs, &driver_attr_try_direct_io);
4246 }
4247
4248
4249 /* The sysfs simple class interface */
4250 static ssize_t st_defined_show(struct class_device *class_dev, char *buf)
4251 {
4252         struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4253         ssize_t l = 0;
4254
4255         l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined);
4256         return l;
4257 }
4258
4259 CLASS_DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
4260
4261 static ssize_t st_defblk_show(struct class_device *class_dev, char *buf)
4262 {
4263         struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4264         ssize_t l = 0;
4265
4266         l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize);
4267         return l;
4268 }
4269
4270 CLASS_DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
4271
4272 static ssize_t st_defdensity_show(struct class_device *class_dev, char *buf)
4273 {
4274         struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4275         ssize_t l = 0;
4276         char *fmt;
4277
4278         fmt = STm->default_density >= 0 ? "0x%02x\n" : "%d\n";
4279         l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density);
4280         return l;
4281 }
4282
4283 CLASS_DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
4284
4285 static ssize_t st_defcompression_show(struct class_device *class_dev, char *buf)
4286 {
4287         struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4288         ssize_t l = 0;
4289
4290         l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1);
4291         return l;
4292 }
4293
4294 CLASS_DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
4295
4296 static void do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
4297 {
4298         int i, rew, error;
4299         char name[10];
4300         struct class_device *st_class_member;
4301
4302         if (!st_sysfs_class)
4303                 return;
4304
4305         for (rew=0; rew < 2; rew++) {
4306                 /* Make sure that the minor numbers corresponding to the four
4307                    first modes always get the same names */
4308                 i = mode << (4 - ST_NBR_MODE_BITS);
4309                 snprintf(name, 10, "%s%s%s", rew ? "n" : "",
4310                          STp->disk->disk_name, st_formats[i]);
4311                 st_class_member =
4312                         class_device_create(st_sysfs_class, NULL,
4313                                             MKDEV(SCSI_TAPE_MAJOR,
4314                                                   TAPE_MINOR(dev_num, mode, rew)),
4315                                             &STp->device->sdev_gendev, "%s", name);
4316                 if (IS_ERR(st_class_member)) {
4317                         printk(KERN_WARNING "st%d: class_device_create failed\n",
4318                                dev_num);
4319                         goto out;
4320                 }
4321                 class_set_devdata(st_class_member, &STp->modes[mode]);
4322
4323                 class_device_create_file(st_class_member,
4324                                          &class_device_attr_defined);
4325                 class_device_create_file(st_class_member,
4326                                          &class_device_attr_default_blksize);
4327                 class_device_create_file(st_class_member,
4328                                          &class_device_attr_default_density);
4329                 class_device_create_file(st_class_member,
4330                                          &class_device_attr_default_compression);
4331                 if (mode == 0 && rew == 0) {
4332                         error = sysfs_create_link(&STp->device->sdev_gendev.kobj,
4333                                                   &st_class_member->kobj,
4334                                                   "tape");
4335                         if (error) {
4336                                 printk(KERN_ERR
4337                                        "st%d: Can't create sysfs link from SCSI device.\n",
4338                                        dev_num);
4339                         }
4340                 }
4341         }
4342  out:
4343         return;
4344 }
4345
4346 /* The following functions may be useful for a larger audience. */
4347 static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, 
4348                               unsigned long uaddr, size_t count, int rw)
4349 {
4350         unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
4351         unsigned long start = uaddr >> PAGE_SHIFT;
4352         const int nr_pages = end - start;
4353         int res, i, j;
4354         struct page **pages;
4355
4356         /* User attempted Overflow! */
4357         if ((uaddr + count) < uaddr)
4358                 return -EINVAL;
4359
4360         /* Too big */
4361         if (nr_pages > max_pages)
4362                 return -ENOMEM;
4363
4364         /* Hmm? */
4365         if (count == 0)
4366                 return 0;
4367
4368         if ((pages = kmalloc(max_pages * sizeof(*pages), GFP_KERNEL)) == NULL)
4369                 return -ENOMEM;
4370
4371         /* Try to fault in all of the necessary pages */
4372         down_read(&current->mm->mmap_sem);
4373         /* rw==READ means read from drive, write into memory area */
4374         res = get_user_pages(
4375                 current,
4376                 current->mm,
4377                 uaddr,
4378                 nr_pages,
4379                 rw == READ,
4380                 0, /* don't force */
4381                 pages,
4382                 NULL);
4383         up_read(&current->mm->mmap_sem);
4384
4385         /* Errors and no page mapped should return here */
4386         if (res < nr_pages)
4387                 goto out_unmap;
4388
4389         for (i=0; i < nr_pages; i++) {
4390                 /* FIXME: flush superflous for rw==READ,
4391                  * probably wrong function for rw==WRITE
4392                  */
4393                 flush_dcache_page(pages[i]);
4394         }
4395
4396         /* Populate the scatter/gather list */
4397         sgl[0].page = pages[0]; 
4398         sgl[0].offset = uaddr & ~PAGE_MASK;
4399         if (nr_pages > 1) {
4400                 sgl[0].length = PAGE_SIZE - sgl[0].offset;
4401                 count -= sgl[0].length;
4402                 for (i=1; i < nr_pages ; i++) {
4403                         sgl[i].offset = 0;
4404                         sgl[i].page = pages[i]; 
4405                         sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE;
4406                         count -= PAGE_SIZE;
4407                 }
4408         }
4409         else {
4410                 sgl[0].length = count;
4411         }
4412
4413         kfree(pages);
4414         return nr_pages;
4415
4416  out_unmap:
4417         if (res > 0) {
4418                 for (j=0; j < res; j++)
4419                         page_cache_release(pages[j]);
4420                 res = 0;
4421         }
4422         kfree(pages);
4423         return res;
4424 }
4425
4426
4427 /* And unmap them... */
4428 static int sgl_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_pages,
4429                                 int dirtied)
4430 {
4431         int i;
4432
4433         for (i=0; i < nr_pages; i++) {
4434                 struct page *page = sgl[i].page;
4435
4436                 if (dirtied)
4437                         SetPageDirty(page);
4438                 /* FIXME: cache flush missing for rw==READ
4439                  * FIXME: call the correct reference counting function
4440                  */
4441                 page_cache_release(page);
4442         }
4443
4444         return 0;
4445 }