Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/block/paride/pf.c
15111 views
1
/*
2
pf.c (c) 1997-8 Grant R. Guenther <[email protected]>
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
62
major You may use this parameter to overide the
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
121
/* Here are things one can override from the insmod command.
122
Most are autoprobed by paride unless set here. Verbose is off
123
by default.
124
125
*/
126
127
static int verbose = 0;
128
static int major = PF_MAJOR;
129
static char *name = PF_NAME;
130
static int cluster = 64;
131
static int nice = 0;
132
static int disable = 0;
133
134
static int drive0[7] = { 0, 0, 0, -1, -1, -1, -1 };
135
static int drive1[7] = { 0, 0, 0, -1, -1, -1, -1 };
136
static int drive2[7] = { 0, 0, 0, -1, -1, -1, -1 };
137
static int drive3[7] = { 0, 0, 0, -1, -1, -1, -1 };
138
139
static int (*drives[4])[7] = {&drive0, &drive1, &drive2, &drive3};
140
static int pf_drive_count;
141
142
enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY};
143
144
/* end of parameters */
145
146
#include <linux/module.h>
147
#include <linux/init.h>
148
#include <linux/fs.h>
149
#include <linux/delay.h>
150
#include <linux/hdreg.h>
151
#include <linux/cdrom.h>
152
#include <linux/spinlock.h>
153
#include <linux/blkdev.h>
154
#include <linux/blkpg.h>
155
#include <linux/mutex.h>
156
#include <asm/uaccess.h>
157
158
static DEFINE_MUTEX(pf_mutex);
159
static DEFINE_SPINLOCK(pf_spin_lock);
160
161
module_param(verbose, bool, 0644);
162
module_param(major, int, 0);
163
module_param(name, charp, 0);
164
module_param(cluster, int, 0);
165
module_param(nice, int, 0);
166
module_param_array(drive0, int, NULL, 0);
167
module_param_array(drive1, int, NULL, 0);
168
module_param_array(drive2, int, NULL, 0);
169
module_param_array(drive3, int, NULL, 0);
170
171
#include "paride.h"
172
#include "pseudo.h"
173
174
/* constants for faking geometry numbers */
175
176
#define PF_FD_MAX 8192 /* use FD geometry under this size */
177
#define PF_FD_HDS 2
178
#define PF_FD_SPT 18
179
#define PF_HD_HDS 64
180
#define PF_HD_SPT 32
181
182
#define PF_MAX_RETRIES 5
183
#define PF_TMO 800 /* interrupt timeout in jiffies */
184
#define PF_SPIN_DEL 50 /* spin delay in micro-seconds */
185
186
#define PF_SPIN (1000000*PF_TMO)/(HZ*PF_SPIN_DEL)
187
188
#define STAT_ERR 0x00001
189
#define STAT_INDEX 0x00002
190
#define STAT_ECC 0x00004
191
#define STAT_DRQ 0x00008
192
#define STAT_SEEK 0x00010
193
#define STAT_WRERR 0x00020
194
#define STAT_READY 0x00040
195
#define STAT_BUSY 0x00080
196
197
#define ATAPI_REQ_SENSE 0x03
198
#define ATAPI_LOCK 0x1e
199
#define ATAPI_DOOR 0x1b
200
#define ATAPI_MODE_SENSE 0x5a
201
#define ATAPI_CAPACITY 0x25
202
#define ATAPI_IDENTIFY 0x12
203
#define ATAPI_READ_10 0x28
204
#define ATAPI_WRITE_10 0x2a
205
206
static int pf_open(struct block_device *bdev, fmode_t mode);
207
static void do_pf_request(struct request_queue * q);
208
static int pf_ioctl(struct block_device *bdev, fmode_t mode,
209
unsigned int cmd, unsigned long arg);
210
static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
211
212
static int pf_release(struct gendisk *disk, fmode_t mode);
213
214
static int pf_detect(void);
215
static void do_pf_read(void);
216
static void do_pf_read_start(void);
217
static void do_pf_write(void);
218
static void do_pf_write_start(void);
219
static void do_pf_read_drq(void);
220
static void do_pf_write_done(void);
221
222
#define PF_NM 0
223
#define PF_RO 1
224
#define PF_RW 2
225
226
#define PF_NAMELEN 8
227
228
struct pf_unit {
229
struct pi_adapter pia; /* interface to paride layer */
230
struct pi_adapter *pi;
231
int removable; /* removable media device ? */
232
int media_status; /* media present ? WP ? */
233
int drive; /* drive */
234
int lun;
235
int access; /* count of active opens ... */
236
int present; /* device present ? */
237
char name[PF_NAMELEN]; /* pf0, pf1, ... */
238
struct gendisk *disk;
239
};
240
241
static struct pf_unit units[PF_UNITS];
242
243
static int pf_identify(struct pf_unit *pf);
244
static void pf_lock(struct pf_unit *pf, int func);
245
static void pf_eject(struct pf_unit *pf);
246
static unsigned int pf_check_events(struct gendisk *disk,
247
unsigned int clearing);
248
249
static char pf_scratch[512]; /* scratch block buffer */
250
251
/* the variables below are used mainly in the I/O request engine, which
252
processes only one request at a time.
253
*/
254
255
static int pf_retries = 0; /* i/o error retry count */
256
static int pf_busy = 0; /* request being processed ? */
257
static struct request *pf_req; /* current request */
258
static int pf_block; /* address of next requested block */
259
static int pf_count; /* number of blocks still to do */
260
static int pf_run; /* sectors in current cluster */
261
static int pf_cmd; /* current command READ/WRITE */
262
static struct pf_unit *pf_current;/* unit of current request */
263
static int pf_mask; /* stopper for pseudo-int */
264
static char *pf_buf; /* buffer for request in progress */
265
266
/* kernel glue structures */
267
268
static const struct block_device_operations pf_fops = {
269
.owner = THIS_MODULE,
270
.open = pf_open,
271
.release = pf_release,
272
.ioctl = pf_ioctl,
273
.getgeo = pf_getgeo,
274
.check_events = pf_check_events,
275
};
276
277
static void __init pf_init_units(void)
278
{
279
struct pf_unit *pf;
280
int unit;
281
282
pf_drive_count = 0;
283
for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) {
284
struct gendisk *disk = alloc_disk(1);
285
if (!disk)
286
continue;
287
pf->disk = disk;
288
pf->pi = &pf->pia;
289
pf->media_status = PF_NM;
290
pf->drive = (*drives[unit])[D_SLV];
291
pf->lun = (*drives[unit])[D_LUN];
292
snprintf(pf->name, PF_NAMELEN, "%s%d", name, unit);
293
disk->major = major;
294
disk->first_minor = unit;
295
strcpy(disk->disk_name, pf->name);
296
disk->fops = &pf_fops;
297
if (!(*drives[unit])[D_PRT])
298
pf_drive_count++;
299
}
300
}
301
302
static int pf_open(struct block_device *bdev, fmode_t mode)
303
{
304
struct pf_unit *pf = bdev->bd_disk->private_data;
305
int ret;
306
307
mutex_lock(&pf_mutex);
308
pf_identify(pf);
309
310
ret = -ENODEV;
311
if (pf->media_status == PF_NM)
312
goto out;
313
314
ret = -EROFS;
315
if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE))
316
goto out;
317
318
ret = 0;
319
pf->access++;
320
if (pf->removable)
321
pf_lock(pf, 1);
322
out:
323
mutex_unlock(&pf_mutex);
324
return ret;
325
}
326
327
static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo)
328
{
329
struct pf_unit *pf = bdev->bd_disk->private_data;
330
sector_t capacity = get_capacity(pf->disk);
331
332
if (capacity < PF_FD_MAX) {
333
geo->cylinders = sector_div(capacity, PF_FD_HDS * PF_FD_SPT);
334
geo->heads = PF_FD_HDS;
335
geo->sectors = PF_FD_SPT;
336
} else {
337
geo->cylinders = sector_div(capacity, PF_HD_HDS * PF_HD_SPT);
338
geo->heads = PF_HD_HDS;
339
geo->sectors = PF_HD_SPT;
340
}
341
342
return 0;
343
}
344
345
static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
346
{
347
struct pf_unit *pf = bdev->bd_disk->private_data;
348
349
if (cmd != CDROMEJECT)
350
return -EINVAL;
351
352
if (pf->access != 1)
353
return -EBUSY;
354
mutex_lock(&pf_mutex);
355
pf_eject(pf);
356
mutex_unlock(&pf_mutex);
357
358
return 0;
359
}
360
361
static int pf_release(struct gendisk *disk, fmode_t mode)
362
{
363
struct pf_unit *pf = disk->private_data;
364
365
mutex_lock(&pf_mutex);
366
if (pf->access <= 0) {
367
mutex_unlock(&pf_mutex);
368
return -EINVAL;
369
}
370
371
pf->access--;
372
373
if (!pf->access && pf->removable)
374
pf_lock(pf, 0);
375
376
mutex_unlock(&pf_mutex);
377
return 0;
378
379
}
380
381
static unsigned int pf_check_events(struct gendisk *disk, unsigned int clearing)
382
{
383
return DISK_EVENT_MEDIA_CHANGE;
384
}
385
386
static inline int status_reg(struct pf_unit *pf)
387
{
388
return pi_read_regr(pf->pi, 1, 6);
389
}
390
391
static inline int read_reg(struct pf_unit *pf, int reg)
392
{
393
return pi_read_regr(pf->pi, 0, reg);
394
}
395
396
static inline void write_reg(struct pf_unit *pf, int reg, int val)
397
{
398
pi_write_regr(pf->pi, 0, reg, val);
399
}
400
401
static int pf_wait(struct pf_unit *pf, int go, int stop, char *fun, char *msg)
402
{
403
int j, r, e, s, p;
404
405
j = 0;
406
while ((((r = status_reg(pf)) & go) || (stop && (!(r & stop))))
407
&& (j++ < PF_SPIN))
408
udelay(PF_SPIN_DEL);
409
410
if ((r & (STAT_ERR & stop)) || (j > PF_SPIN)) {
411
s = read_reg(pf, 7);
412
e = read_reg(pf, 1);
413
p = read_reg(pf, 2);
414
if (j > PF_SPIN)
415
e |= 0x100;
416
if (fun)
417
printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
418
" loop=%d phase=%d\n",
419
pf->name, fun, msg, r, s, e, j, p);
420
return (e << 8) + s;
421
}
422
return 0;
423
}
424
425
static int pf_command(struct pf_unit *pf, char *cmd, int dlen, char *fun)
426
{
427
pi_connect(pf->pi);
428
429
write_reg(pf, 6, 0xa0+0x10*pf->drive);
430
431
if (pf_wait(pf, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
432
pi_disconnect(pf->pi);
433
return -1;
434
}
435
436
write_reg(pf, 4, dlen % 256);
437
write_reg(pf, 5, dlen / 256);
438
write_reg(pf, 7, 0xa0); /* ATAPI packet command */
439
440
if (pf_wait(pf, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
441
pi_disconnect(pf->pi);
442
return -1;
443
}
444
445
if (read_reg(pf, 2) != 1) {
446
printk("%s: %s: command phase error\n", pf->name, fun);
447
pi_disconnect(pf->pi);
448
return -1;
449
}
450
451
pi_write_block(pf->pi, cmd, 12);
452
453
return 0;
454
}
455
456
static int pf_completion(struct pf_unit *pf, char *buf, char *fun)
457
{
458
int r, s, n;
459
460
r = pf_wait(pf, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
461
fun, "completion");
462
463
if ((read_reg(pf, 2) & 2) && (read_reg(pf, 7) & STAT_DRQ)) {
464
n = (((read_reg(pf, 4) + 256 * read_reg(pf, 5)) +
465
3) & 0xfffc);
466
pi_read_block(pf->pi, buf, n);
467
}
468
469
s = pf_wait(pf, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
470
471
pi_disconnect(pf->pi);
472
473
return (r ? r : s);
474
}
475
476
static void pf_req_sense(struct pf_unit *pf, int quiet)
477
{
478
char rs_cmd[12] =
479
{ ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
480
char buf[16];
481
int r;
482
483
r = pf_command(pf, rs_cmd, 16, "Request sense");
484
mdelay(1);
485
if (!r)
486
pf_completion(pf, buf, "Request sense");
487
488
if ((!r) && (!quiet))
489
printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
490
pf->name, buf[2] & 0xf, buf[12], buf[13]);
491
}
492
493
static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fun)
494
{
495
int r;
496
497
r = pf_command(pf, cmd, dlen, fun);
498
mdelay(1);
499
if (!r)
500
r = pf_completion(pf, buf, fun);
501
if (r)
502
pf_req_sense(pf, !fun);
503
504
return r;
505
}
506
507
static void pf_lock(struct pf_unit *pf, int func)
508
{
509
char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };
510
511
pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
512
}
513
514
static void pf_eject(struct pf_unit *pf)
515
{
516
char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
517
518
pf_lock(pf, 0);
519
pf_atapi(pf, ej_cmd, 0, pf_scratch, "eject");
520
}
521
522
#define PF_RESET_TMO 30 /* in tenths of a second */
523
524
static void pf_sleep(int cs)
525
{
526
schedule_timeout_interruptible(cs);
527
}
528
529
/* the ATAPI standard actually specifies the contents of all 7 registers
530
after a reset, but the specification is ambiguous concerning the last
531
two bytes, and different drives interpret the standard differently.
532
*/
533
534
static int pf_reset(struct pf_unit *pf)
535
{
536
int i, k, flg;
537
int expect[5] = { 1, 1, 1, 0x14, 0xeb };
538
539
pi_connect(pf->pi);
540
write_reg(pf, 6, 0xa0+0x10*pf->drive);
541
write_reg(pf, 7, 8);
542
543
pf_sleep(20 * HZ / 1000);
544
545
k = 0;
546
while ((k++ < PF_RESET_TMO) && (status_reg(pf) & STAT_BUSY))
547
pf_sleep(HZ / 10);
548
549
flg = 1;
550
for (i = 0; i < 5; i++)
551
flg &= (read_reg(pf, i + 1) == expect[i]);
552
553
if (verbose) {
554
printk("%s: Reset (%d) signature = ", pf->name, k);
555
for (i = 0; i < 5; i++)
556
printk("%3x", read_reg(pf, i + 1));
557
if (!flg)
558
printk(" (incorrect)");
559
printk("\n");
560
}
561
562
pi_disconnect(pf->pi);
563
return flg - 1;
564
}
565
566
static void pf_mode_sense(struct pf_unit *pf)
567
{
568
char ms_cmd[12] =
569
{ ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
570
char buf[8];
571
572
pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
573
pf->media_status = PF_RW;
574
if (buf[3] & 0x80)
575
pf->media_status = PF_RO;
576
}
577
578
static void xs(char *buf, char *targ, int offs, int len)
579
{
580
int j, k, l;
581
582
j = 0;
583
l = 0;
584
for (k = 0; k < len; k++)
585
if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
586
l = targ[j++] = buf[k + offs];
587
if (l == 0x20)
588
j--;
589
targ[j] = 0;
590
}
591
592
static int xl(char *buf, int offs)
593
{
594
int v, k;
595
596
v = 0;
597
for (k = 0; k < 4; k++)
598
v = v * 256 + (buf[k + offs] & 0xff);
599
return v;
600
}
601
602
static void pf_get_capacity(struct pf_unit *pf)
603
{
604
char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
605
char buf[8];
606
int bs;
607
608
if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
609
pf->media_status = PF_NM;
610
return;
611
}
612
set_capacity(pf->disk, xl(buf, 0) + 1);
613
bs = xl(buf, 4);
614
if (bs != 512) {
615
set_capacity(pf->disk, 0);
616
if (verbose)
617
printk("%s: Drive %d, LUN %d,"
618
" unsupported block size %d\n",
619
pf->name, pf->drive, pf->lun, bs);
620
}
621
}
622
623
static int pf_identify(struct pf_unit *pf)
624
{
625
int dt, s;
626
char *ms[2] = { "master", "slave" };
627
char mf[10], id[18];
628
char id_cmd[12] =
629
{ ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
630
char buf[36];
631
632
s = pf_atapi(pf, id_cmd, 36, buf, "identify");
633
if (s)
634
return -1;
635
636
dt = buf[0] & 0x1f;
637
if ((dt != 0) && (dt != 7)) {
638
if (verbose)
639
printk("%s: Drive %d, LUN %d, unsupported type %d\n",
640
pf->name, pf->drive, pf->lun, dt);
641
return -1;
642
}
643
644
xs(buf, mf, 8, 8);
645
xs(buf, id, 16, 16);
646
647
pf->removable = (buf[1] & 0x80);
648
649
pf_mode_sense(pf);
650
pf_mode_sense(pf);
651
pf_mode_sense(pf);
652
653
pf_get_capacity(pf);
654
655
printk("%s: %s %s, %s LUN %d, type %d",
656
pf->name, mf, id, ms[pf->drive], pf->lun, dt);
657
if (pf->removable)
658
printk(", removable");
659
if (pf->media_status == PF_NM)
660
printk(", no media\n");
661
else {
662
if (pf->media_status == PF_RO)
663
printk(", RO");
664
printk(", %llu blocks\n",
665
(unsigned long long)get_capacity(pf->disk));
666
}
667
return 0;
668
}
669
670
/* returns 0, with id set if drive is detected
671
-1, if drive detection failed
672
*/
673
static int pf_probe(struct pf_unit *pf)
674
{
675
if (pf->drive == -1) {
676
for (pf->drive = 0; pf->drive <= 1; pf->drive++)
677
if (!pf_reset(pf)) {
678
if (pf->lun != -1)
679
return pf_identify(pf);
680
else
681
for (pf->lun = 0; pf->lun < 8; pf->lun++)
682
if (!pf_identify(pf))
683
return 0;
684
}
685
} else {
686
if (pf_reset(pf))
687
return -1;
688
if (pf->lun != -1)
689
return pf_identify(pf);
690
for (pf->lun = 0; pf->lun < 8; pf->lun++)
691
if (!pf_identify(pf))
692
return 0;
693
}
694
return -1;
695
}
696
697
static int pf_detect(void)
698
{
699
struct pf_unit *pf = units;
700
int k, unit;
701
702
printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
703
name, name, PF_VERSION, major, cluster, nice);
704
705
k = 0;
706
if (pf_drive_count == 0) {
707
if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF,
708
verbose, pf->name)) {
709
if (!pf_probe(pf) && pf->disk) {
710
pf->present = 1;
711
k++;
712
} else
713
pi_release(pf->pi);
714
}
715
716
} else
717
for (unit = 0; unit < PF_UNITS; unit++, pf++) {
718
int *conf = *drives[unit];
719
if (!conf[D_PRT])
720
continue;
721
if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD],
722
conf[D_UNI], conf[D_PRO], conf[D_DLY],
723
pf_scratch, PI_PF, verbose, pf->name)) {
724
if (pf->disk && !pf_probe(pf)) {
725
pf->present = 1;
726
k++;
727
} else
728
pi_release(pf->pi);
729
}
730
}
731
if (k)
732
return 0;
733
734
printk("%s: No ATAPI disk detected\n", name);
735
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
736
put_disk(pf->disk);
737
return -1;
738
}
739
740
/* The i/o request engine */
741
742
static int pf_start(struct pf_unit *pf, int cmd, int b, int c)
743
{
744
int i;
745
char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
746
747
for (i = 0; i < 4; i++) {
748
io_cmd[5 - i] = b & 0xff;
749
b = b >> 8;
750
}
751
752
io_cmd[8] = c & 0xff;
753
io_cmd[7] = (c >> 8) & 0xff;
754
755
i = pf_command(pf, io_cmd, c * 512, "start i/o");
756
757
mdelay(1);
758
759
return i;
760
}
761
762
static int pf_ready(void)
763
{
764
return (((status_reg(pf_current) & (STAT_BUSY | pf_mask)) == pf_mask));
765
}
766
767
static struct request_queue *pf_queue;
768
769
static void pf_end_request(int err)
770
{
771
if (pf_req && !__blk_end_request_cur(pf_req, err))
772
pf_req = NULL;
773
}
774
775
static void do_pf_request(struct request_queue * q)
776
{
777
if (pf_busy)
778
return;
779
repeat:
780
if (!pf_req) {
781
pf_req = blk_fetch_request(q);
782
if (!pf_req)
783
return;
784
}
785
786
pf_current = pf_req->rq_disk->private_data;
787
pf_block = blk_rq_pos(pf_req);
788
pf_run = blk_rq_sectors(pf_req);
789
pf_count = blk_rq_cur_sectors(pf_req);
790
791
if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) {
792
pf_end_request(-EIO);
793
goto repeat;
794
}
795
796
pf_cmd = rq_data_dir(pf_req);
797
pf_buf = pf_req->buffer;
798
pf_retries = 0;
799
800
pf_busy = 1;
801
if (pf_cmd == READ)
802
pi_do_claimed(pf_current->pi, do_pf_read);
803
else if (pf_cmd == WRITE)
804
pi_do_claimed(pf_current->pi, do_pf_write);
805
else {
806
pf_busy = 0;
807
pf_end_request(-EIO);
808
goto repeat;
809
}
810
}
811
812
static int pf_next_buf(void)
813
{
814
unsigned long saved_flags;
815
816
pf_count--;
817
pf_run--;
818
pf_buf += 512;
819
pf_block++;
820
if (!pf_run)
821
return 1;
822
if (!pf_count) {
823
spin_lock_irqsave(&pf_spin_lock, saved_flags);
824
pf_end_request(0);
825
spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
826
if (!pf_req)
827
return 1;
828
pf_count = blk_rq_cur_sectors(pf_req);
829
pf_buf = pf_req->buffer;
830
}
831
return 0;
832
}
833
834
static inline void next_request(int err)
835
{
836
unsigned long saved_flags;
837
838
spin_lock_irqsave(&pf_spin_lock, saved_flags);
839
pf_end_request(err);
840
pf_busy = 0;
841
do_pf_request(pf_queue);
842
spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
843
}
844
845
/* detach from the calling context - in case the spinlock is held */
846
static void do_pf_read(void)
847
{
848
ps_set_intr(do_pf_read_start, NULL, 0, nice);
849
}
850
851
static void do_pf_read_start(void)
852
{
853
pf_busy = 1;
854
855
if (pf_start(pf_current, ATAPI_READ_10, pf_block, pf_run)) {
856
pi_disconnect(pf_current->pi);
857
if (pf_retries < PF_MAX_RETRIES) {
858
pf_retries++;
859
pi_do_claimed(pf_current->pi, do_pf_read_start);
860
return;
861
}
862
next_request(-EIO);
863
return;
864
}
865
pf_mask = STAT_DRQ;
866
ps_set_intr(do_pf_read_drq, pf_ready, PF_TMO, nice);
867
}
868
869
static void do_pf_read_drq(void)
870
{
871
while (1) {
872
if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
873
"read block", "completion") & STAT_ERR) {
874
pi_disconnect(pf_current->pi);
875
if (pf_retries < PF_MAX_RETRIES) {
876
pf_req_sense(pf_current, 0);
877
pf_retries++;
878
pi_do_claimed(pf_current->pi, do_pf_read_start);
879
return;
880
}
881
next_request(-EIO);
882
return;
883
}
884
pi_read_block(pf_current->pi, pf_buf, 512);
885
if (pf_next_buf())
886
break;
887
}
888
pi_disconnect(pf_current->pi);
889
next_request(0);
890
}
891
892
static void do_pf_write(void)
893
{
894
ps_set_intr(do_pf_write_start, NULL, 0, nice);
895
}
896
897
static void do_pf_write_start(void)
898
{
899
pf_busy = 1;
900
901
if (pf_start(pf_current, ATAPI_WRITE_10, pf_block, pf_run)) {
902
pi_disconnect(pf_current->pi);
903
if (pf_retries < PF_MAX_RETRIES) {
904
pf_retries++;
905
pi_do_claimed(pf_current->pi, do_pf_write_start);
906
return;
907
}
908
next_request(-EIO);
909
return;
910
}
911
912
while (1) {
913
if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
914
"write block", "data wait") & STAT_ERR) {
915
pi_disconnect(pf_current->pi);
916
if (pf_retries < PF_MAX_RETRIES) {
917
pf_retries++;
918
pi_do_claimed(pf_current->pi, do_pf_write_start);
919
return;
920
}
921
next_request(-EIO);
922
return;
923
}
924
pi_write_block(pf_current->pi, pf_buf, 512);
925
if (pf_next_buf())
926
break;
927
}
928
pf_mask = 0;
929
ps_set_intr(do_pf_write_done, pf_ready, PF_TMO, nice);
930
}
931
932
static void do_pf_write_done(void)
933
{
934
if (pf_wait(pf_current, STAT_BUSY, 0, "write block", "done") & STAT_ERR) {
935
pi_disconnect(pf_current->pi);
936
if (pf_retries < PF_MAX_RETRIES) {
937
pf_retries++;
938
pi_do_claimed(pf_current->pi, do_pf_write_start);
939
return;
940
}
941
next_request(-EIO);
942
return;
943
}
944
pi_disconnect(pf_current->pi);
945
next_request(0);
946
}
947
948
static int __init pf_init(void)
949
{ /* preliminary initialisation */
950
struct pf_unit *pf;
951
int unit;
952
953
if (disable)
954
return -EINVAL;
955
956
pf_init_units();
957
958
if (pf_detect())
959
return -ENODEV;
960
pf_busy = 0;
961
962
if (register_blkdev(major, name)) {
963
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
964
put_disk(pf->disk);
965
return -EBUSY;
966
}
967
pf_queue = blk_init_queue(do_pf_request, &pf_spin_lock);
968
if (!pf_queue) {
969
unregister_blkdev(major, name);
970
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
971
put_disk(pf->disk);
972
return -ENOMEM;
973
}
974
975
blk_queue_max_segments(pf_queue, cluster);
976
977
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
978
struct gendisk *disk = pf->disk;
979
980
if (!pf->present)
981
continue;
982
disk->private_data = pf;
983
disk->queue = pf_queue;
984
add_disk(disk);
985
}
986
return 0;
987
}
988
989
static void __exit pf_exit(void)
990
{
991
struct pf_unit *pf;
992
int unit;
993
unregister_blkdev(major, name);
994
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
995
if (!pf->present)
996
continue;
997
del_gendisk(pf->disk);
998
put_disk(pf->disk);
999
pi_release(pf->pi);
1000
}
1001
blk_cleanup_queue(pf_queue);
1002
}
1003
1004
MODULE_LICENSE("GPL");
1005
module_init(pf_init)
1006
module_exit(pf_exit)
1007
1008