]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blame - drivers/block/paride/pf.c
Merge branches 'for-5.1/upstream-fixes', 'for-5.2/core', 'for-5.2/ish', 'for-5.2...
[mirror_ubuntu-kernels.git] / drivers / block / paride / pf.c
CommitLineData
1da177e4
LT
1/*
2 pf.c (c) 1997-8 Grant R. Guenther <grant@torque.net>
3 Under the terms of the GNU General Public License.
4
5 This is the high-level driver for parallel port ATAPI disk
6 drives based on chips supported by the paride module.
7
8 By default, the driver will autoprobe for a single parallel
9 port ATAPI disk drive, but if their individual parameters are
10 specified, the driver can handle up to 4 drives.
11
12 The behaviour of the pf driver can be altered by setting
13 some parameters from the insmod command line. The following
14 parameters are adjustable:
15
16 drive0 These four arguments can be arrays of
17 drive1 1-7 integers as follows:
18 drive2
19 drive3 <prt>,<pro>,<uni>,<mod>,<slv>,<lun>,<dly>
20
21 Where,
22
23 <prt> is the base of the parallel port address for
24 the corresponding drive. (required)
25
26 <pro> is the protocol number for the adapter that
27 supports this drive. These numbers are
28 logged by 'paride' when the protocol modules
29 are initialised. (0 if not given)
30
31 <uni> for those adapters that support chained
32 devices, this is the unit selector for the
33 chain of devices on the given port. It should
34 be zero for devices that don't support chaining.
35 (0 if not given)
36
37 <mod> this can be -1 to choose the best mode, or one
38 of the mode numbers supported by the adapter.
39 (-1 if not given)
40
41 <slv> ATAPI CDroms can be jumpered to master or slave.
42 Set this to 0 to choose the master drive, 1 to
43 choose the slave, -1 (the default) to choose the
44 first drive found.
45
46 <lun> Some ATAPI devices support multiple LUNs.
47 One example is the ATAPI PD/CD drive from
48 Matshita/Panasonic. This device has a
49 CD drive on LUN 0 and a PD drive on LUN 1.
50 By default, the driver will search for the
51 first LUN with a supported device. Set
52 this parameter to force it to use a specific
53 LUN. (default -1)
54
55 <dly> some parallel ports require the driver to
56 go more slowly. -1 sets a default value that
57 should work with the chosen protocol. Otherwise,
58 set this to a small integer, the larger it is
59 the slower the port i/o. In some cases, setting
60 this to zero will speed up the device. (default -1)
61
505d3085 62 major You may use this parameter to override the
1da177e4
LT
63 default major number (47) that this driver
64 will use. Be sure to change the device
65 name as well.
66
67 name This parameter is a character string that
68 contains the name the kernel will use for this
69 device (in /proc output, for instance).
70 (default "pf").
71
72 cluster The driver will attempt to aggregate requests
73 for adjacent blocks into larger multi-block
74 clusters. The maximum cluster size (in 512
75 byte sectors) is set with this parameter.
76 (default 64)
77
78 verbose This parameter controls the amount of logging
79 that the driver will do. Set it to 0 for
80 normal operation, 1 to see autoprobe progress
81 messages, or 2 to see additional debugging
82 output. (default 0)
83
84 nice This parameter controls the driver's use of
85 idle CPU time, at the expense of some speed.
86
87 If this driver is built into the kernel, you can use the
88 following command line parameters, with the same values
89 as the corresponding module parameters listed above:
90
91 pf.drive0
92 pf.drive1
93 pf.drive2
94 pf.drive3
95 pf.cluster
96 pf.nice
97
98 In addition, you can use the parameter pf.disable to disable
99 the driver entirely.
100
101*/
102
103/* Changes:
104
105 1.01 GRG 1998.05.03 Changes for SMP. Eliminate sti().
106 Fix for drives that don't clear STAT_ERR
107 until after next CDB delivered.
108 Small change in pf_completion to round
109 up transfer size.
110 1.02 GRG 1998.06.16 Eliminated an Ugh
111 1.03 GRG 1998.08.16 Use HZ in loop timings, extra debugging
112 1.04 GRG 1998.09.24 Added jumbo support
113
114*/
115
116#define PF_VERSION "1.04"
117#define PF_MAJOR 47
118#define PF_NAME "pf"
119#define PF_UNITS 4
120
90ab5ee9
RR
121#include <linux/types.h>
122
1da177e4
LT
123/* Here are things one can override from the insmod command.
124 Most are autoprobed by paride unless set here. Verbose is off
125 by default.
126
127*/
128
90ab5ee9 129static bool verbose = 0;
1da177e4
LT
130static int major = PF_MAJOR;
131static char *name = PF_NAME;
132static int cluster = 64;
133static int nice = 0;
134static int disable = 0;
135
136static int drive0[7] = { 0, 0, 0, -1, -1, -1, -1 };
137static int drive1[7] = { 0, 0, 0, -1, -1, -1, -1 };
138static int drive2[7] = { 0, 0, 0, -1, -1, -1, -1 };
139static int drive3[7] = { 0, 0, 0, -1, -1, -1, -1 };
140
141static int (*drives[4])[7] = {&drive0, &drive1, &drive2, &drive3};
142static int pf_drive_count;
143
144enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY};
145
146/* end of parameters */
147
148#include <linux/module.h>
149#include <linux/init.h>
150#include <linux/fs.h>
151#include <linux/delay.h>
152#include <linux/hdreg.h>
153#include <linux/cdrom.h>
154#include <linux/spinlock.h>
77218ddf 155#include <linux/blk-mq.h>
1da177e4 156#include <linux/blkpg.h>
2a48fc0a 157#include <linux/mutex.h>
7c0f6ba6 158#include <linux/uaccess.h>
1da177e4 159
2a48fc0a 160static DEFINE_MUTEX(pf_mutex);
671d40f4 161static DEFINE_SPINLOCK(pf_spin_lock);
1da177e4
LT
162
163module_param(verbose, bool, 0644);
164module_param(major, int, 0);
165module_param(name, charp, 0);
166module_param(cluster, int, 0);
167module_param(nice, int, 0);
168module_param_array(drive0, int, NULL, 0);
169module_param_array(drive1, int, NULL, 0);
170module_param_array(drive2, int, NULL, 0);
171module_param_array(drive3, int, NULL, 0);
172
173#include "paride.h"
174#include "pseudo.h"
175
176/* constants for faking geometry numbers */
177
178#define PF_FD_MAX 8192 /* use FD geometry under this size */
179#define PF_FD_HDS 2
180#define PF_FD_SPT 18
181#define PF_HD_HDS 64
182#define PF_HD_SPT 32
183
184#define PF_MAX_RETRIES 5
185#define PF_TMO 800 /* interrupt timeout in jiffies */
186#define PF_SPIN_DEL 50 /* spin delay in micro-seconds */
187
188#define PF_SPIN (1000000*PF_TMO)/(HZ*PF_SPIN_DEL)
189
190#define STAT_ERR 0x00001
191#define STAT_INDEX 0x00002
192#define STAT_ECC 0x00004
193#define STAT_DRQ 0x00008
194#define STAT_SEEK 0x00010
195#define STAT_WRERR 0x00020
196#define STAT_READY 0x00040
197#define STAT_BUSY 0x00080
198
199#define ATAPI_REQ_SENSE 0x03
200#define ATAPI_LOCK 0x1e
201#define ATAPI_DOOR 0x1b
202#define ATAPI_MODE_SENSE 0x5a
203#define ATAPI_CAPACITY 0x25
204#define ATAPI_IDENTIFY 0x12
205#define ATAPI_READ_10 0x28
206#define ATAPI_WRITE_10 0x2a
207
8cfc7ca4 208static int pf_open(struct block_device *bdev, fmode_t mode);
77218ddf
JA
209static blk_status_t pf_queue_rq(struct blk_mq_hw_ctx *hctx,
210 const struct blk_mq_queue_data *bd);
8cfc7ca4 211static int pf_ioctl(struct block_device *bdev, fmode_t mode,
1da177e4 212 unsigned int cmd, unsigned long arg);
a885c8c4 213static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
1da177e4 214
db2a144b 215static void pf_release(struct gendisk *disk, fmode_t mode);
1da177e4
LT
216
217static int pf_detect(void);
218static void do_pf_read(void);
219static void do_pf_read_start(void);
220static void do_pf_write(void);
221static void do_pf_write_start(void);
222static void do_pf_read_drq(void);
223static void do_pf_write_done(void);
224
225#define PF_NM 0
226#define PF_RO 1
227#define PF_RW 2
228
229#define PF_NAMELEN 8
230
231struct pf_unit {
232 struct pi_adapter pia; /* interface to paride layer */
233 struct pi_adapter *pi;
234 int removable; /* removable media device ? */
235 int media_status; /* media present ? WP ? */
236 int drive; /* drive */
237 int lun;
238 int access; /* count of active opens ... */
239 int present; /* device present ? */
240 char name[PF_NAMELEN]; /* pf0, pf1, ... */
241 struct gendisk *disk;
77218ddf
JA
242 struct blk_mq_tag_set tag_set;
243 struct list_head rq_list;
1da177e4
LT
244};
245
246static struct pf_unit units[PF_UNITS];
247
248static int pf_identify(struct pf_unit *pf);
249static void pf_lock(struct pf_unit *pf, int func);
250static void pf_eject(struct pf_unit *pf);
b1b56b93
TH
251static unsigned int pf_check_events(struct gendisk *disk,
252 unsigned int clearing);
1da177e4
LT
253
254static char pf_scratch[512]; /* scratch block buffer */
255
256/* the variables below are used mainly in the I/O request engine, which
257 processes only one request at a time.
258*/
259
260static int pf_retries = 0; /* i/o error retry count */
261static int pf_busy = 0; /* request being processed ? */
262static struct request *pf_req; /* current request */
263static int pf_block; /* address of next requested block */
264static int pf_count; /* number of blocks still to do */
265static int pf_run; /* sectors in current cluster */
266static int pf_cmd; /* current command READ/WRITE */
267static struct pf_unit *pf_current;/* unit of current request */
268static int pf_mask; /* stopper for pseudo-int */
269static char *pf_buf; /* buffer for request in progress */
9f4ba6b0 270static void *par_drv; /* reference of parport driver */
1da177e4
LT
271
272/* kernel glue structures */
273
83d5cde4 274static const struct block_device_operations pf_fops = {
1da177e4 275 .owner = THIS_MODULE,
8cfc7ca4
AV
276 .open = pf_open,
277 .release = pf_release,
8a6cfeb6 278 .ioctl = pf_ioctl,
a885c8c4 279 .getgeo = pf_getgeo,
b1b56b93 280 .check_events = pf_check_events,
1da177e4
LT
281};
282
77218ddf
JA
283static const struct blk_mq_ops pf_mq_ops = {
284 .queue_rq = pf_queue_rq,
285};
286
1da177e4
LT
287static void __init pf_init_units(void)
288{
289 struct pf_unit *pf;
290 int unit;
291
292 pf_drive_count = 0;
293 for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) {
77218ddf
JA
294 struct gendisk *disk;
295
296 disk = alloc_disk(1);
1da177e4
LT
297 if (!disk)
298 continue;
77218ddf
JA
299
300 disk->queue = blk_mq_init_sq_queue(&pf->tag_set, &pf_mq_ops,
301 1, BLK_MQ_F_SHOULD_MERGE);
302 if (IS_ERR(disk->queue)) {
3a644142 303 put_disk(disk);
77218ddf
JA
304 disk->queue = NULL;
305 continue;
3a644142 306 }
77218ddf
JA
307
308 INIT_LIST_HEAD(&pf->rq_list);
309 disk->queue->queuedata = pf;
3a644142 310 blk_queue_max_segments(disk->queue, cluster);
8fc45044 311 blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
1da177e4
LT
312 pf->disk = disk;
313 pf->pi = &pf->pia;
314 pf->media_status = PF_NM;
315 pf->drive = (*drives[unit])[D_SLV];
316 pf->lun = (*drives[unit])[D_LUN];
317 snprintf(pf->name, PF_NAMELEN, "%s%d", name, unit);
318 disk->major = major;
319 disk->first_minor = unit;
320 strcpy(disk->disk_name, pf->name);
321 disk->fops = &pf_fops;
322 if (!(*drives[unit])[D_PRT])
323 pf_drive_count++;
324 }
325}
326
8cfc7ca4 327static int pf_open(struct block_device *bdev, fmode_t mode)
1da177e4 328{
8cfc7ca4 329 struct pf_unit *pf = bdev->bd_disk->private_data;
6e9624b8 330 int ret;
1da177e4 331
2a48fc0a 332 mutex_lock(&pf_mutex);
1da177e4
LT
333 pf_identify(pf);
334
6e9624b8 335 ret = -ENODEV;
1da177e4 336 if (pf->media_status == PF_NM)
6e9624b8 337 goto out;
1da177e4 338
6e9624b8 339 ret = -EROFS;
8cfc7ca4 340 if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE))
6e9624b8 341 goto out;
1da177e4 342
6e9624b8 343 ret = 0;
1da177e4
LT
344 pf->access++;
345 if (pf->removable)
346 pf_lock(pf, 1);
6e9624b8 347out:
2a48fc0a 348 mutex_unlock(&pf_mutex);
6e9624b8 349 return ret;
1da177e4
LT
350}
351
a885c8c4 352static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo)
1da177e4 353{
a885c8c4
CH
354 struct pf_unit *pf = bdev->bd_disk->private_data;
355 sector_t capacity = get_capacity(pf->disk);
356
1da177e4 357 if (capacity < PF_FD_MAX) {
a885c8c4
CH
358 geo->cylinders = sector_div(capacity, PF_FD_HDS * PF_FD_SPT);
359 geo->heads = PF_FD_HDS;
360 geo->sectors = PF_FD_SPT;
1da177e4 361 } else {
a885c8c4
CH
362 geo->cylinders = sector_div(capacity, PF_HD_HDS * PF_HD_SPT);
363 geo->heads = PF_HD_HDS;
364 geo->sectors = PF_HD_SPT;
1da177e4 365 }
a885c8c4
CH
366
367 return 0;
368}
369
8cfc7ca4 370static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
a885c8c4 371{
8cfc7ca4 372 struct pf_unit *pf = bdev->bd_disk->private_data;
a885c8c4
CH
373
374 if (cmd != CDROMEJECT)
375 return -EINVAL;
376
377 if (pf->access != 1)
378 return -EBUSY;
2a48fc0a 379 mutex_lock(&pf_mutex);
a885c8c4 380 pf_eject(pf);
2a48fc0a 381 mutex_unlock(&pf_mutex);
8a6cfeb6 382
1da177e4
LT
383 return 0;
384}
385
db2a144b 386static void pf_release(struct gendisk *disk, fmode_t mode)
1da177e4 387{
8cfc7ca4 388 struct pf_unit *pf = disk->private_data;
1da177e4 389
2a48fc0a 390 mutex_lock(&pf_mutex);
6e9624b8 391 if (pf->access <= 0) {
2a48fc0a 392 mutex_unlock(&pf_mutex);
db2a144b
AV
393 WARN_ON(1);
394 return;
6e9624b8 395 }
1da177e4
LT
396
397 pf->access--;
398
399 if (!pf->access && pf->removable)
400 pf_lock(pf, 0);
401
2a48fc0a 402 mutex_unlock(&pf_mutex);
1da177e4
LT
403}
404
b1b56b93 405static unsigned int pf_check_events(struct gendisk *disk, unsigned int clearing)
1da177e4 406{
b1b56b93 407 return DISK_EVENT_MEDIA_CHANGE;
1da177e4
LT
408}
409
410static inline int status_reg(struct pf_unit *pf)
411{
412 return pi_read_regr(pf->pi, 1, 6);
413}
414
415static inline int read_reg(struct pf_unit *pf, int reg)
416{
417 return pi_read_regr(pf->pi, 0, reg);
418}
419
420static inline void write_reg(struct pf_unit *pf, int reg, int val)
421{
422 pi_write_regr(pf->pi, 0, reg, val);
423}
424
425static int pf_wait(struct pf_unit *pf, int go, int stop, char *fun, char *msg)
426{
427 int j, r, e, s, p;
428
429 j = 0;
430 while ((((r = status_reg(pf)) & go) || (stop && (!(r & stop))))
431 && (j++ < PF_SPIN))
432 udelay(PF_SPIN_DEL);
433
c12ec0a2 434 if ((r & (STAT_ERR & stop)) || (j > PF_SPIN)) {
1da177e4
LT
435 s = read_reg(pf, 7);
436 e = read_reg(pf, 1);
437 p = read_reg(pf, 2);
c12ec0a2 438 if (j > PF_SPIN)
1da177e4
LT
439 e |= 0x100;
440 if (fun)
441 printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
442 " loop=%d phase=%d\n",
443 pf->name, fun, msg, r, s, e, j, p);
444 return (e << 8) + s;
445 }
446 return 0;
447}
448
449static int pf_command(struct pf_unit *pf, char *cmd, int dlen, char *fun)
450{
451 pi_connect(pf->pi);
452
453 write_reg(pf, 6, 0xa0+0x10*pf->drive);
454
455 if (pf_wait(pf, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
456 pi_disconnect(pf->pi);
457 return -1;
458 }
459
460 write_reg(pf, 4, dlen % 256);
461 write_reg(pf, 5, dlen / 256);
462 write_reg(pf, 7, 0xa0); /* ATAPI packet command */
463
464 if (pf_wait(pf, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
465 pi_disconnect(pf->pi);
466 return -1;
467 }
468
469 if (read_reg(pf, 2) != 1) {
470 printk("%s: %s: command phase error\n", pf->name, fun);
471 pi_disconnect(pf->pi);
472 return -1;
473 }
474
475 pi_write_block(pf->pi, cmd, 12);
476
477 return 0;
478}
479
480static int pf_completion(struct pf_unit *pf, char *buf, char *fun)
481{
482 int r, s, n;
483
484 r = pf_wait(pf, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
485 fun, "completion");
486
487 if ((read_reg(pf, 2) & 2) && (read_reg(pf, 7) & STAT_DRQ)) {
488 n = (((read_reg(pf, 4) + 256 * read_reg(pf, 5)) +
489 3) & 0xfffc);
490 pi_read_block(pf->pi, buf, n);
491 }
492
493 s = pf_wait(pf, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
494
495 pi_disconnect(pf->pi);
496
497 return (r ? r : s);
498}
499
500static void pf_req_sense(struct pf_unit *pf, int quiet)
501{
502 char rs_cmd[12] =
503 { ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
504 char buf[16];
505 int r;
506
507 r = pf_command(pf, rs_cmd, 16, "Request sense");
508 mdelay(1);
509 if (!r)
510 pf_completion(pf, buf, "Request sense");
511
512 if ((!r) && (!quiet))
513 printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
514 pf->name, buf[2] & 0xf, buf[12], buf[13]);
515}
516
517static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fun)
518{
519 int r;
520
521 r = pf_command(pf, cmd, dlen, fun);
522 mdelay(1);
523 if (!r)
524 r = pf_completion(pf, buf, fun);
525 if (r)
526 pf_req_sense(pf, !fun);
527
528 return r;
529}
530
1da177e4
LT
531static void pf_lock(struct pf_unit *pf, int func)
532{
533 char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };
534
e62aa046 535 pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
1da177e4
LT
536}
537
538static void pf_eject(struct pf_unit *pf)
539{
540 char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
541
542 pf_lock(pf, 0);
543 pf_atapi(pf, ej_cmd, 0, pf_scratch, "eject");
544}
545
546#define PF_RESET_TMO 30 /* in tenths of a second */
547
548static void pf_sleep(int cs)
549{
86e84862 550 schedule_timeout_interruptible(cs);
1da177e4
LT
551}
552
553/* the ATAPI standard actually specifies the contents of all 7 registers
554 after a reset, but the specification is ambiguous concerning the last
555 two bytes, and different drives interpret the standard differently.
556 */
557
558static int pf_reset(struct pf_unit *pf)
559{
560 int i, k, flg;
561 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
562
563 pi_connect(pf->pi);
564 write_reg(pf, 6, 0xa0+0x10*pf->drive);
565 write_reg(pf, 7, 8);
566
567 pf_sleep(20 * HZ / 1000);
568
569 k = 0;
570 while ((k++ < PF_RESET_TMO) && (status_reg(pf) & STAT_BUSY))
571 pf_sleep(HZ / 10);
572
573 flg = 1;
574 for (i = 0; i < 5; i++)
575 flg &= (read_reg(pf, i + 1) == expect[i]);
576
577 if (verbose) {
578 printk("%s: Reset (%d) signature = ", pf->name, k);
579 for (i = 0; i < 5; i++)
580 printk("%3x", read_reg(pf, i + 1));
581 if (!flg)
582 printk(" (incorrect)");
583 printk("\n");
584 }
585
586 pi_disconnect(pf->pi);
587 return flg - 1;
588}
589
590static void pf_mode_sense(struct pf_unit *pf)
591{
592 char ms_cmd[12] =
593 { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
594 char buf[8];
595
e62aa046 596 pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
1da177e4
LT
597 pf->media_status = PF_RW;
598 if (buf[3] & 0x80)
599 pf->media_status = PF_RO;
600}
601
602static void xs(char *buf, char *targ, int offs, int len)
603{
604 int j, k, l;
605
606 j = 0;
607 l = 0;
608 for (k = 0; k < len; k++)
609 if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
610 l = targ[j++] = buf[k + offs];
611 if (l == 0x20)
612 j--;
613 targ[j] = 0;
614}
615
616static int xl(char *buf, int offs)
617{
618 int v, k;
619
620 v = 0;
621 for (k = 0; k < 4; k++)
622 v = v * 256 + (buf[k + offs] & 0xff);
623 return v;
624}
625
626static void pf_get_capacity(struct pf_unit *pf)
627{
628 char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
629 char buf[8];
630 int bs;
631
e62aa046 632 if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
1da177e4
LT
633 pf->media_status = PF_NM;
634 return;
635 }
636 set_capacity(pf->disk, xl(buf, 0) + 1);
637 bs = xl(buf, 4);
638 if (bs != 512) {
639 set_capacity(pf->disk, 0);
640 if (verbose)
641 printk("%s: Drive %d, LUN %d,"
642 " unsupported block size %d\n",
643 pf->name, pf->drive, pf->lun, bs);
644 }
645}
646
647static int pf_identify(struct pf_unit *pf)
648{
649 int dt, s;
650 char *ms[2] = { "master", "slave" };
651 char mf[10], id[18];
652 char id_cmd[12] =
653 { ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
654 char buf[36];
655
656 s = pf_atapi(pf, id_cmd, 36, buf, "identify");
657 if (s)
658 return -1;
659
660 dt = buf[0] & 0x1f;
661 if ((dt != 0) && (dt != 7)) {
662 if (verbose)
663 printk("%s: Drive %d, LUN %d, unsupported type %d\n",
664 pf->name, pf->drive, pf->lun, dt);
665 return -1;
666 }
667
668 xs(buf, mf, 8, 8);
669 xs(buf, id, 16, 16);
670
671 pf->removable = (buf[1] & 0x80);
672
673 pf_mode_sense(pf);
674 pf_mode_sense(pf);
675 pf_mode_sense(pf);
676
677 pf_get_capacity(pf);
678
679 printk("%s: %s %s, %s LUN %d, type %d",
680 pf->name, mf, id, ms[pf->drive], pf->lun, dt);
681 if (pf->removable)
682 printk(", removable");
683 if (pf->media_status == PF_NM)
684 printk(", no media\n");
685 else {
686 if (pf->media_status == PF_RO)
687 printk(", RO");
688 printk(", %llu blocks\n",
689 (unsigned long long)get_capacity(pf->disk));
690 }
691 return 0;
692}
693
694/* returns 0, with id set if drive is detected
695 -1, if drive detection failed
696*/
697static int pf_probe(struct pf_unit *pf)
698{
699 if (pf->drive == -1) {
700 for (pf->drive = 0; pf->drive <= 1; pf->drive++)
701 if (!pf_reset(pf)) {
702 if (pf->lun != -1)
703 return pf_identify(pf);
704 else
705 for (pf->lun = 0; pf->lun < 8; pf->lun++)
706 if (!pf_identify(pf))
707 return 0;
708 }
709 } else {
710 if (pf_reset(pf))
711 return -1;
712 if (pf->lun != -1)
713 return pf_identify(pf);
714 for (pf->lun = 0; pf->lun < 8; pf->lun++)
715 if (!pf_identify(pf))
716 return 0;
717 }
718 return -1;
719}
720
721static int pf_detect(void)
722{
723 struct pf_unit *pf = units;
724 int k, unit;
725
726 printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
727 name, name, PF_VERSION, major, cluster, nice);
728
9f4ba6b0
SM
729 par_drv = pi_register_driver(name);
730 if (!par_drv) {
731 pr_err("failed to register %s driver\n", name);
732 return -1;
733 }
1da177e4
LT
734 k = 0;
735 if (pf_drive_count == 0) {
736 if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF,
737 verbose, pf->name)) {
738 if (!pf_probe(pf) && pf->disk) {
739 pf->present = 1;
740 k++;
741 } else
742 pi_release(pf->pi);
743 }
744
745 } else
746 for (unit = 0; unit < PF_UNITS; unit++, pf++) {
747 int *conf = *drives[unit];
748 if (!conf[D_PRT])
749 continue;
750 if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD],
751 conf[D_UNI], conf[D_PRO], conf[D_DLY],
752 pf_scratch, PI_PF, verbose, pf->name)) {
8e53cfc8 753 if (pf->disk && !pf_probe(pf)) {
1da177e4
LT
754 pf->present = 1;
755 k++;
756 } else
757 pi_release(pf->pi);
758 }
759 }
760 if (k)
761 return 0;
762
763 printk("%s: No ATAPI disk detected\n", name);
6ce59025
JA
764 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
765 blk_cleanup_queue(pf->disk->queue);
766 pf->disk->queue = NULL;
767 blk_mq_free_tag_set(&pf->tag_set);
1da177e4 768 put_disk(pf->disk);
6ce59025 769 }
9f4ba6b0 770 pi_unregister_driver(par_drv);
1da177e4
LT
771 return -1;
772}
773
774/* The i/o request engine */
775
776static int pf_start(struct pf_unit *pf, int cmd, int b, int c)
777{
778 int i;
779 char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
780
781 for (i = 0; i < 4; i++) {
782 io_cmd[5 - i] = b & 0xff;
783 b = b >> 8;
784 }
785
786 io_cmd[8] = c & 0xff;
787 io_cmd[7] = (c >> 8) & 0xff;
788
789 i = pf_command(pf, io_cmd, c * 512, "start i/o");
790
791 mdelay(1);
792
793 return i;
794}
795
796static int pf_ready(void)
797{
798 return (((status_reg(pf_current) & (STAT_BUSY | pf_mask)) == pf_mask));
799}
800
3a644142
OS
801static int pf_queue;
802
803static int set_next_request(void)
804{
805 struct pf_unit *pf;
3a644142
OS
806 int old_pos = pf_queue;
807
808 do {
809 pf = &units[pf_queue];
3a644142
OS
810 if (++pf_queue == PF_UNITS)
811 pf_queue = 0;
77218ddf
JA
812 if (pf->present && !list_empty(&pf->rq_list)) {
813 pf_req = list_first_entry(&pf->rq_list, struct request,
814 queuelist);
815 list_del_init(&pf_req->queuelist);
816 blk_mq_start_request(pf_req);
817 break;
3a644142
OS
818 }
819 } while (pf_queue != old_pos);
820
821 return pf_req != NULL;
822}
1da177e4 823
2a842aca 824static void pf_end_request(blk_status_t err)
9564df1f 825{
77218ddf
JA
826 if (!pf_req)
827 return;
828 if (!blk_update_request(pf_req, err, blk_rq_cur_bytes(pf_req))) {
829 __blk_mq_end_request(pf_req, err);
9564df1f 830 pf_req = NULL;
77218ddf 831 }
9564df1f
JA
832}
833
3a644142 834static void pf_request(void)
1da177e4
LT
835{
836 if (pf_busy)
837 return;
838repeat:
3a644142
OS
839 if (!pf_req && !set_next_request())
840 return;
1da177e4
LT
841
842 pf_current = pf_req->rq_disk->private_data;
83096ebf
TH
843 pf_block = blk_rq_pos(pf_req);
844 pf_run = blk_rq_sectors(pf_req);
845 pf_count = blk_rq_cur_sectors(pf_req);
1da177e4
LT
846
847 if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) {
2a842aca 848 pf_end_request(BLK_STS_IOERR);
1da177e4
LT
849 goto repeat;
850 }
851
852 pf_cmd = rq_data_dir(pf_req);
b4f42e28 853 pf_buf = bio_data(pf_req->bio);
1da177e4
LT
854 pf_retries = 0;
855
856 pf_busy = 1;
857 if (pf_cmd == READ)
858 pi_do_claimed(pf_current->pi, do_pf_read);
859 else if (pf_cmd == WRITE)
860 pi_do_claimed(pf_current->pi, do_pf_write);
861 else {
862 pf_busy = 0;
2a842aca 863 pf_end_request(BLK_STS_IOERR);
1da177e4
LT
864 goto repeat;
865 }
866}
867
77218ddf
JA
868static blk_status_t pf_queue_rq(struct blk_mq_hw_ctx *hctx,
869 const struct blk_mq_queue_data *bd)
3a644142 870{
77218ddf
JA
871 struct pf_unit *pf = hctx->queue->queuedata;
872
873 spin_lock_irq(&pf_spin_lock);
874 list_add_tail(&bd->rq->queuelist, &pf->rq_list);
3a644142 875 pf_request();
77218ddf
JA
876 spin_unlock_irq(&pf_spin_lock);
877
878 return BLK_STS_OK;
3a644142
OS
879}
880
1da177e4
LT
881static int pf_next_buf(void)
882{
883 unsigned long saved_flags;
884
885 pf_count--;
886 pf_run--;
887 pf_buf += 512;
888 pf_block++;
889 if (!pf_run)
1da177e4 890 return 1;
e62aa046
OZ
891 if (!pf_count) {
892 spin_lock_irqsave(&pf_spin_lock, saved_flags);
f06d9a2b 893 pf_end_request(0);
e62aa046
OZ
894 spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
895 if (!pf_req)
896 return 1;
83096ebf 897 pf_count = blk_rq_cur_sectors(pf_req);
b4f42e28 898 pf_buf = bio_data(pf_req->bio);
e62aa046
OZ
899 }
900 return 0;
1da177e4
LT
901}
902
2a842aca 903static inline void next_request(blk_status_t err)
1da177e4
LT
904{
905 unsigned long saved_flags;
906
907 spin_lock_irqsave(&pf_spin_lock, saved_flags);
f06d9a2b 908 pf_end_request(err);
1da177e4 909 pf_busy = 0;
3a644142 910 pf_request();
1da177e4
LT
911 spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
912}
913
914/* detach from the calling context - in case the spinlock is held */
915static void do_pf_read(void)
916{
917 ps_set_intr(do_pf_read_start, NULL, 0, nice);
918}
919
920static void do_pf_read_start(void)
921{
922 pf_busy = 1;
923
924 if (pf_start(pf_current, ATAPI_READ_10, pf_block, pf_run)) {
925 pi_disconnect(pf_current->pi);
926 if (pf_retries < PF_MAX_RETRIES) {
927 pf_retries++;
928 pi_do_claimed(pf_current->pi, do_pf_read_start);
929 return;
930 }
2a842aca 931 next_request(BLK_STS_IOERR);
1da177e4
LT
932 return;
933 }
934 pf_mask = STAT_DRQ;
935 ps_set_intr(do_pf_read_drq, pf_ready, PF_TMO, nice);
936}
937
938static void do_pf_read_drq(void)
939{
940 while (1) {
941 if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
942 "read block", "completion") & STAT_ERR) {
943 pi_disconnect(pf_current->pi);
944 if (pf_retries < PF_MAX_RETRIES) {
945 pf_req_sense(pf_current, 0);
946 pf_retries++;
947 pi_do_claimed(pf_current->pi, do_pf_read_start);
948 return;
949 }
2a842aca 950 next_request(BLK_STS_IOERR);
1da177e4
LT
951 return;
952 }
953 pi_read_block(pf_current->pi, pf_buf, 512);
954 if (pf_next_buf())
955 break;
956 }
957 pi_disconnect(pf_current->pi);
f06d9a2b 958 next_request(0);
1da177e4
LT
959}
960
961static void do_pf_write(void)
962{
963 ps_set_intr(do_pf_write_start, NULL, 0, nice);
964}
965
966static void do_pf_write_start(void)
967{
968 pf_busy = 1;
969
970 if (pf_start(pf_current, ATAPI_WRITE_10, pf_block, pf_run)) {
971 pi_disconnect(pf_current->pi);
972 if (pf_retries < PF_MAX_RETRIES) {
973 pf_retries++;
974 pi_do_claimed(pf_current->pi, do_pf_write_start);
975 return;
976 }
2a842aca 977 next_request(BLK_STS_IOERR);
1da177e4
LT
978 return;
979 }
980
981 while (1) {
982 if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
983 "write block", "data wait") & STAT_ERR) {
984 pi_disconnect(pf_current->pi);
985 if (pf_retries < PF_MAX_RETRIES) {
986 pf_retries++;
987 pi_do_claimed(pf_current->pi, do_pf_write_start);
988 return;
989 }
2a842aca 990 next_request(BLK_STS_IOERR);
1da177e4
LT
991 return;
992 }
993 pi_write_block(pf_current->pi, pf_buf, 512);
994 if (pf_next_buf())
995 break;
996 }
997 pf_mask = 0;
998 ps_set_intr(do_pf_write_done, pf_ready, PF_TMO, nice);
999}
1000
1001static void do_pf_write_done(void)
1002{
1003 if (pf_wait(pf_current, STAT_BUSY, 0, "write block", "done") & STAT_ERR) {
1004 pi_disconnect(pf_current->pi);
1005 if (pf_retries < PF_MAX_RETRIES) {
1006 pf_retries++;
1007 pi_do_claimed(pf_current->pi, do_pf_write_start);
1008 return;
1009 }
2a842aca 1010 next_request(BLK_STS_IOERR);
1da177e4
LT
1011 return;
1012 }
1013 pi_disconnect(pf_current->pi);
f06d9a2b 1014 next_request(0);
1da177e4
LT
1015}
1016
1017static int __init pf_init(void)
1018{ /* preliminary initialisation */
1019 struct pf_unit *pf;
1020 int unit;
1021
1022 if (disable)
8bca98ca 1023 return -EINVAL;
1da177e4
LT
1024
1025 pf_init_units();
1026
1027 if (pf_detect())
8bca98ca 1028 return -ENODEV;
1da177e4
LT
1029 pf_busy = 0;
1030
1031 if (register_blkdev(major, name)) {
1032 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
1033 put_disk(pf->disk);
8bca98ca 1034 return -EBUSY;
1da177e4 1035 }
1da177e4
LT
1036
1037 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
1038 struct gendisk *disk = pf->disk;
1039
1040 if (!pf->present)
1041 continue;
1042 disk->private_data = pf;
1da177e4
LT
1043 add_disk(disk);
1044 }
1045 return 0;
1046}
1047
1048static void __exit pf_exit(void)
1049{
1050 struct pf_unit *pf;
1051 int unit;
1052 unregister_blkdev(major, name);
1053 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
6ce59025
JA
1054 if (pf->present)
1055 del_gendisk(pf->disk);
1056
3a644142 1057 blk_cleanup_queue(pf->disk->queue);
77218ddf 1058 blk_mq_free_tag_set(&pf->tag_set);
1da177e4 1059 put_disk(pf->disk);
6ce59025
JA
1060
1061 if (pf->present)
1062 pi_release(pf->pi);
1da177e4 1063 }
1da177e4
LT
1064}
1065
1066MODULE_LICENSE("GPL");
1067module_init(pf_init)
1068module_exit(pf_exit)