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