This source file includes following definitions.
- pf_init_units
- pf_open
- pf_getgeo
- pf_ioctl
- pf_release
- pf_check_events
- status_reg
- read_reg
- write_reg
- pf_wait
- pf_command
- pf_completion
- pf_req_sense
- pf_atapi
- pf_lock
- pf_eject
- pf_sleep
- pf_reset
- pf_mode_sense
- xs
- xl
- pf_get_capacity
- pf_identify
- pf_probe
- pf_detect
- pf_start
- pf_ready
- set_next_request
- pf_end_request
- pf_request
- pf_queue_rq
- pf_next_buf
- next_request
- do_pf_read
- do_pf_read_start
- do_pf_read_drq
- do_pf_write
- do_pf_write_start
- do_pf_write_done
- pf_init
- pf_exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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 #include <linux/types.h>
122
123
124
125
126
127
128
129 static bool verbose = 0;
130 static int major = PF_MAJOR;
131 static char *name = PF_NAME;
132 static int cluster = 64;
133 static int nice = 0;
134 static int disable = 0;
135
136 static int drive0[7] = { 0, 0, 0, -1, -1, -1, -1 };
137 static int drive1[7] = { 0, 0, 0, -1, -1, -1, -1 };
138 static int drive2[7] = { 0, 0, 0, -1, -1, -1, -1 };
139 static int drive3[7] = { 0, 0, 0, -1, -1, -1, -1 };
140
141 static int (*drives[4])[7] = {&drive0, &drive1, &drive2, &drive3};
142 static int pf_drive_count;
143
144 enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY};
145
146
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>
155 #include <linux/blk-mq.h>
156 #include <linux/blkpg.h>
157 #include <linux/mutex.h>
158 #include <linux/uaccess.h>
159
160 static DEFINE_MUTEX(pf_mutex);
161 static DEFINE_SPINLOCK(pf_spin_lock);
162
163 module_param(verbose, bool, 0644);
164 module_param(major, int, 0);
165 module_param(name, charp, 0);
166 module_param(cluster, int, 0);
167 module_param(nice, int, 0);
168 module_param_array(drive0, int, NULL, 0);
169 module_param_array(drive1, int, NULL, 0);
170 module_param_array(drive2, int, NULL, 0);
171 module_param_array(drive3, int, NULL, 0);
172
173 #include "paride.h"
174 #include "pseudo.h"
175
176
177
178 #define PF_FD_MAX 8192
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
186 #define PF_SPIN_DEL 50
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
208 static int pf_open(struct block_device *bdev, fmode_t mode);
209 static blk_status_t pf_queue_rq(struct blk_mq_hw_ctx *hctx,
210 const struct blk_mq_queue_data *bd);
211 static int pf_ioctl(struct block_device *bdev, fmode_t mode,
212 unsigned int cmd, unsigned long arg);
213 static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
214
215 static void pf_release(struct gendisk *disk, fmode_t mode);
216
217 static int pf_detect(void);
218 static void do_pf_read(void);
219 static void do_pf_read_start(void);
220 static void do_pf_write(void);
221 static void do_pf_write_start(void);
222 static void do_pf_read_drq(void);
223 static 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
231 struct pf_unit {
232 struct pi_adapter pia;
233 struct pi_adapter *pi;
234 int removable;
235 int media_status;
236 int drive;
237 int lun;
238 int access;
239 int present;
240 char name[PF_NAMELEN];
241 struct gendisk *disk;
242 struct blk_mq_tag_set tag_set;
243 struct list_head rq_list;
244 };
245
246 static struct pf_unit units[PF_UNITS];
247
248 static int pf_identify(struct pf_unit *pf);
249 static void pf_lock(struct pf_unit *pf, int func);
250 static void pf_eject(struct pf_unit *pf);
251 static unsigned int pf_check_events(struct gendisk *disk,
252 unsigned int clearing);
253
254 static char pf_scratch[512];
255
256
257
258
259
260 static int pf_retries = 0;
261 static int pf_busy = 0;
262 static struct request *pf_req;
263 static int pf_block;
264 static int pf_count;
265 static int pf_run;
266 static int pf_cmd;
267 static struct pf_unit *pf_current;
268 static int pf_mask;
269 static char *pf_buf;
270 static void *par_drv;
271
272
273
274 static const struct block_device_operations pf_fops = {
275 .owner = THIS_MODULE,
276 .open = pf_open,
277 .release = pf_release,
278 .ioctl = pf_ioctl,
279 .getgeo = pf_getgeo,
280 .check_events = pf_check_events,
281 };
282
283 static const struct blk_mq_ops pf_mq_ops = {
284 .queue_rq = pf_queue_rq,
285 };
286
287 static 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++) {
294 struct gendisk *disk;
295
296 disk = alloc_disk(1);
297 if (!disk)
298 continue;
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)) {
303 disk->queue = NULL;
304 put_disk(disk);
305 continue;
306 }
307
308 INIT_LIST_HEAD(&pf->rq_list);
309 disk->queue->queuedata = pf;
310 blk_queue_max_segments(disk->queue, cluster);
311 blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
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 disk->events = DISK_EVENT_MEDIA_CHANGE;
323 if (!(*drives[unit])[D_PRT])
324 pf_drive_count++;
325 }
326 }
327
328 static int pf_open(struct block_device *bdev, fmode_t mode)
329 {
330 struct pf_unit *pf = bdev->bd_disk->private_data;
331 int ret;
332
333 mutex_lock(&pf_mutex);
334 pf_identify(pf);
335
336 ret = -ENODEV;
337 if (pf->media_status == PF_NM)
338 goto out;
339
340 ret = -EROFS;
341 if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE))
342 goto out;
343
344 ret = 0;
345 pf->access++;
346 if (pf->removable)
347 pf_lock(pf, 1);
348 out:
349 mutex_unlock(&pf_mutex);
350 return ret;
351 }
352
353 static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo)
354 {
355 struct pf_unit *pf = bdev->bd_disk->private_data;
356 sector_t capacity = get_capacity(pf->disk);
357
358 if (capacity < PF_FD_MAX) {
359 geo->cylinders = sector_div(capacity, PF_FD_HDS * PF_FD_SPT);
360 geo->heads = PF_FD_HDS;
361 geo->sectors = PF_FD_SPT;
362 } else {
363 geo->cylinders = sector_div(capacity, PF_HD_HDS * PF_HD_SPT);
364 geo->heads = PF_HD_HDS;
365 geo->sectors = PF_HD_SPT;
366 }
367
368 return 0;
369 }
370
371 static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
372 {
373 struct pf_unit *pf = bdev->bd_disk->private_data;
374
375 if (cmd != CDROMEJECT)
376 return -EINVAL;
377
378 if (pf->access != 1)
379 return -EBUSY;
380 mutex_lock(&pf_mutex);
381 pf_eject(pf);
382 mutex_unlock(&pf_mutex);
383
384 return 0;
385 }
386
387 static void pf_release(struct gendisk *disk, fmode_t mode)
388 {
389 struct pf_unit *pf = disk->private_data;
390
391 mutex_lock(&pf_mutex);
392 if (pf->access <= 0) {
393 mutex_unlock(&pf_mutex);
394 WARN_ON(1);
395 return;
396 }
397
398 pf->access--;
399
400 if (!pf->access && pf->removable)
401 pf_lock(pf, 0);
402
403 mutex_unlock(&pf_mutex);
404 }
405
406 static unsigned int pf_check_events(struct gendisk *disk, unsigned int clearing)
407 {
408 return DISK_EVENT_MEDIA_CHANGE;
409 }
410
411 static inline int status_reg(struct pf_unit *pf)
412 {
413 return pi_read_regr(pf->pi, 1, 6);
414 }
415
416 static inline int read_reg(struct pf_unit *pf, int reg)
417 {
418 return pi_read_regr(pf->pi, 0, reg);
419 }
420
421 static inline void write_reg(struct pf_unit *pf, int reg, int val)
422 {
423 pi_write_regr(pf->pi, 0, reg, val);
424 }
425
426 static int pf_wait(struct pf_unit *pf, int go, int stop, char *fun, char *msg)
427 {
428 int j, r, e, s, p;
429
430 j = 0;
431 while ((((r = status_reg(pf)) & go) || (stop && (!(r & stop))))
432 && (j++ < PF_SPIN))
433 udelay(PF_SPIN_DEL);
434
435 if ((r & (STAT_ERR & stop)) || (j > PF_SPIN)) {
436 s = read_reg(pf, 7);
437 e = read_reg(pf, 1);
438 p = read_reg(pf, 2);
439 if (j > PF_SPIN)
440 e |= 0x100;
441 if (fun)
442 printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
443 " loop=%d phase=%d\n",
444 pf->name, fun, msg, r, s, e, j, p);
445 return (e << 8) + s;
446 }
447 return 0;
448 }
449
450 static int pf_command(struct pf_unit *pf, char *cmd, int dlen, char *fun)
451 {
452 pi_connect(pf->pi);
453
454 write_reg(pf, 6, 0xa0+0x10*pf->drive);
455
456 if (pf_wait(pf, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
457 pi_disconnect(pf->pi);
458 return -1;
459 }
460
461 write_reg(pf, 4, dlen % 256);
462 write_reg(pf, 5, dlen / 256);
463 write_reg(pf, 7, 0xa0);
464
465 if (pf_wait(pf, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
466 pi_disconnect(pf->pi);
467 return -1;
468 }
469
470 if (read_reg(pf, 2) != 1) {
471 printk("%s: %s: command phase error\n", pf->name, fun);
472 pi_disconnect(pf->pi);
473 return -1;
474 }
475
476 pi_write_block(pf->pi, cmd, 12);
477
478 return 0;
479 }
480
481 static int pf_completion(struct pf_unit *pf, char *buf, char *fun)
482 {
483 int r, s, n;
484
485 r = pf_wait(pf, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
486 fun, "completion");
487
488 if ((read_reg(pf, 2) & 2) && (read_reg(pf, 7) & STAT_DRQ)) {
489 n = (((read_reg(pf, 4) + 256 * read_reg(pf, 5)) +
490 3) & 0xfffc);
491 pi_read_block(pf->pi, buf, n);
492 }
493
494 s = pf_wait(pf, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
495
496 pi_disconnect(pf->pi);
497
498 return (r ? r : s);
499 }
500
501 static void pf_req_sense(struct pf_unit *pf, int quiet)
502 {
503 char rs_cmd[12] =
504 { ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
505 char buf[16];
506 int r;
507
508 r = pf_command(pf, rs_cmd, 16, "Request sense");
509 mdelay(1);
510 if (!r)
511 pf_completion(pf, buf, "Request sense");
512
513 if ((!r) && (!quiet))
514 printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
515 pf->name, buf[2] & 0xf, buf[12], buf[13]);
516 }
517
518 static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fun)
519 {
520 int r;
521
522 r = pf_command(pf, cmd, dlen, fun);
523 mdelay(1);
524 if (!r)
525 r = pf_completion(pf, buf, fun);
526 if (r)
527 pf_req_sense(pf, !fun);
528
529 return r;
530 }
531
532 static void pf_lock(struct pf_unit *pf, int func)
533 {
534 char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };
535
536 pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
537 }
538
539 static void pf_eject(struct pf_unit *pf)
540 {
541 char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
542
543 pf_lock(pf, 0);
544 pf_atapi(pf, ej_cmd, 0, pf_scratch, "eject");
545 }
546
547 #define PF_RESET_TMO 30
548
549 static void pf_sleep(int cs)
550 {
551 schedule_timeout_interruptible(cs);
552 }
553
554
555
556
557
558
559 static int pf_reset(struct pf_unit *pf)
560 {
561 int i, k, flg;
562 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
563
564 pi_connect(pf->pi);
565 write_reg(pf, 6, 0xa0+0x10*pf->drive);
566 write_reg(pf, 7, 8);
567
568 pf_sleep(20 * HZ / 1000);
569
570 k = 0;
571 while ((k++ < PF_RESET_TMO) && (status_reg(pf) & STAT_BUSY))
572 pf_sleep(HZ / 10);
573
574 flg = 1;
575 for (i = 0; i < 5; i++)
576 flg &= (read_reg(pf, i + 1) == expect[i]);
577
578 if (verbose) {
579 printk("%s: Reset (%d) signature = ", pf->name, k);
580 for (i = 0; i < 5; i++)
581 printk("%3x", read_reg(pf, i + 1));
582 if (!flg)
583 printk(" (incorrect)");
584 printk("\n");
585 }
586
587 pi_disconnect(pf->pi);
588 return flg - 1;
589 }
590
591 static void pf_mode_sense(struct pf_unit *pf)
592 {
593 char ms_cmd[12] =
594 { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
595 char buf[8];
596
597 pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
598 pf->media_status = PF_RW;
599 if (buf[3] & 0x80)
600 pf->media_status = PF_RO;
601 }
602
603 static void xs(char *buf, char *targ, int offs, int len)
604 {
605 int j, k, l;
606
607 j = 0;
608 l = 0;
609 for (k = 0; k < len; k++)
610 if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
611 l = targ[j++] = buf[k + offs];
612 if (l == 0x20)
613 j--;
614 targ[j] = 0;
615 }
616
617 static int xl(char *buf, int offs)
618 {
619 int v, k;
620
621 v = 0;
622 for (k = 0; k < 4; k++)
623 v = v * 256 + (buf[k + offs] & 0xff);
624 return v;
625 }
626
627 static void pf_get_capacity(struct pf_unit *pf)
628 {
629 char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
630 char buf[8];
631 int bs;
632
633 if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
634 pf->media_status = PF_NM;
635 return;
636 }
637 set_capacity(pf->disk, xl(buf, 0) + 1);
638 bs = xl(buf, 4);
639 if (bs != 512) {
640 set_capacity(pf->disk, 0);
641 if (verbose)
642 printk("%s: Drive %d, LUN %d,"
643 " unsupported block size %d\n",
644 pf->name, pf->drive, pf->lun, bs);
645 }
646 }
647
648 static int pf_identify(struct pf_unit *pf)
649 {
650 int dt, s;
651 char *ms[2] = { "master", "slave" };
652 char mf[10], id[18];
653 char id_cmd[12] =
654 { ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
655 char buf[36];
656
657 s = pf_atapi(pf, id_cmd, 36, buf, "identify");
658 if (s)
659 return -1;
660
661 dt = buf[0] & 0x1f;
662 if ((dt != 0) && (dt != 7)) {
663 if (verbose)
664 printk("%s: Drive %d, LUN %d, unsupported type %d\n",
665 pf->name, pf->drive, pf->lun, dt);
666 return -1;
667 }
668
669 xs(buf, mf, 8, 8);
670 xs(buf, id, 16, 16);
671
672 pf->removable = (buf[1] & 0x80);
673
674 pf_mode_sense(pf);
675 pf_mode_sense(pf);
676 pf_mode_sense(pf);
677
678 pf_get_capacity(pf);
679
680 printk("%s: %s %s, %s LUN %d, type %d",
681 pf->name, mf, id, ms[pf->drive], pf->lun, dt);
682 if (pf->removable)
683 printk(", removable");
684 if (pf->media_status == PF_NM)
685 printk(", no media\n");
686 else {
687 if (pf->media_status == PF_RO)
688 printk(", RO");
689 printk(", %llu blocks\n",
690 (unsigned long long)get_capacity(pf->disk));
691 }
692 return 0;
693 }
694
695
696
697
698 static int pf_probe(struct pf_unit *pf)
699 {
700 if (pf->drive == -1) {
701 for (pf->drive = 0; pf->drive <= 1; pf->drive++)
702 if (!pf_reset(pf)) {
703 if (pf->lun != -1)
704 return pf_identify(pf);
705 else
706 for (pf->lun = 0; pf->lun < 8; pf->lun++)
707 if (!pf_identify(pf))
708 return 0;
709 }
710 } else {
711 if (pf_reset(pf))
712 return -1;
713 if (pf->lun != -1)
714 return pf_identify(pf);
715 for (pf->lun = 0; pf->lun < 8; pf->lun++)
716 if (!pf_identify(pf))
717 return 0;
718 }
719 return -1;
720 }
721
722 static int pf_detect(void)
723 {
724 struct pf_unit *pf = units;
725 int k, unit;
726
727 printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
728 name, name, PF_VERSION, major, cluster, nice);
729
730 par_drv = pi_register_driver(name);
731 if (!par_drv) {
732 pr_err("failed to register %s driver\n", name);
733 return -1;
734 }
735 k = 0;
736 if (pf_drive_count == 0) {
737 if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF,
738 verbose, pf->name)) {
739 if (!pf_probe(pf) && pf->disk) {
740 pf->present = 1;
741 k++;
742 } else
743 pi_release(pf->pi);
744 }
745
746 } else
747 for (unit = 0; unit < PF_UNITS; unit++, pf++) {
748 int *conf = *drives[unit];
749 if (!conf[D_PRT])
750 continue;
751 if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD],
752 conf[D_UNI], conf[D_PRO], conf[D_DLY],
753 pf_scratch, PI_PF, verbose, pf->name)) {
754 if (pf->disk && !pf_probe(pf)) {
755 pf->present = 1;
756 k++;
757 } else
758 pi_release(pf->pi);
759 }
760 }
761 if (k)
762 return 0;
763
764 printk("%s: No ATAPI disk detected\n", name);
765 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
766 if (!pf->disk)
767 continue;
768 blk_cleanup_queue(pf->disk->queue);
769 pf->disk->queue = NULL;
770 blk_mq_free_tag_set(&pf->tag_set);
771 put_disk(pf->disk);
772 }
773 pi_unregister_driver(par_drv);
774 return -1;
775 }
776
777
778
779 static int pf_start(struct pf_unit *pf, int cmd, int b, int c)
780 {
781 int i;
782 char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
783
784 for (i = 0; i < 4; i++) {
785 io_cmd[5 - i] = b & 0xff;
786 b = b >> 8;
787 }
788
789 io_cmd[8] = c & 0xff;
790 io_cmd[7] = (c >> 8) & 0xff;
791
792 i = pf_command(pf, io_cmd, c * 512, "start i/o");
793
794 mdelay(1);
795
796 return i;
797 }
798
799 static int pf_ready(void)
800 {
801 return (((status_reg(pf_current) & (STAT_BUSY | pf_mask)) == pf_mask));
802 }
803
804 static int pf_queue;
805
806 static int set_next_request(void)
807 {
808 struct pf_unit *pf;
809 int old_pos = pf_queue;
810
811 do {
812 pf = &units[pf_queue];
813 if (++pf_queue == PF_UNITS)
814 pf_queue = 0;
815 if (pf->present && !list_empty(&pf->rq_list)) {
816 pf_req = list_first_entry(&pf->rq_list, struct request,
817 queuelist);
818 list_del_init(&pf_req->queuelist);
819 blk_mq_start_request(pf_req);
820 break;
821 }
822 } while (pf_queue != old_pos);
823
824 return pf_req != NULL;
825 }
826
827 static void pf_end_request(blk_status_t err)
828 {
829 if (!pf_req)
830 return;
831 if (!blk_update_request(pf_req, err, blk_rq_cur_bytes(pf_req))) {
832 __blk_mq_end_request(pf_req, err);
833 pf_req = NULL;
834 }
835 }
836
837 static void pf_request(void)
838 {
839 if (pf_busy)
840 return;
841 repeat:
842 if (!pf_req && !set_next_request())
843 return;
844
845 pf_current = pf_req->rq_disk->private_data;
846 pf_block = blk_rq_pos(pf_req);
847 pf_run = blk_rq_sectors(pf_req);
848 pf_count = blk_rq_cur_sectors(pf_req);
849
850 if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) {
851 pf_end_request(BLK_STS_IOERR);
852 goto repeat;
853 }
854
855 pf_cmd = rq_data_dir(pf_req);
856 pf_buf = bio_data(pf_req->bio);
857 pf_retries = 0;
858
859 pf_busy = 1;
860 if (pf_cmd == READ)
861 pi_do_claimed(pf_current->pi, do_pf_read);
862 else if (pf_cmd == WRITE)
863 pi_do_claimed(pf_current->pi, do_pf_write);
864 else {
865 pf_busy = 0;
866 pf_end_request(BLK_STS_IOERR);
867 goto repeat;
868 }
869 }
870
871 static blk_status_t pf_queue_rq(struct blk_mq_hw_ctx *hctx,
872 const struct blk_mq_queue_data *bd)
873 {
874 struct pf_unit *pf = hctx->queue->queuedata;
875
876 spin_lock_irq(&pf_spin_lock);
877 list_add_tail(&bd->rq->queuelist, &pf->rq_list);
878 pf_request();
879 spin_unlock_irq(&pf_spin_lock);
880
881 return BLK_STS_OK;
882 }
883
884 static int pf_next_buf(void)
885 {
886 unsigned long saved_flags;
887
888 pf_count--;
889 pf_run--;
890 pf_buf += 512;
891 pf_block++;
892 if (!pf_run)
893 return 1;
894 if (!pf_count) {
895 spin_lock_irqsave(&pf_spin_lock, saved_flags);
896 pf_end_request(0);
897 spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
898 if (!pf_req)
899 return 1;
900 pf_count = blk_rq_cur_sectors(pf_req);
901 pf_buf = bio_data(pf_req->bio);
902 }
903 return 0;
904 }
905
906 static inline void next_request(blk_status_t err)
907 {
908 unsigned long saved_flags;
909
910 spin_lock_irqsave(&pf_spin_lock, saved_flags);
911 pf_end_request(err);
912 pf_busy = 0;
913 pf_request();
914 spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
915 }
916
917
918 static void do_pf_read(void)
919 {
920 ps_set_intr(do_pf_read_start, NULL, 0, nice);
921 }
922
923 static void do_pf_read_start(void)
924 {
925 pf_busy = 1;
926
927 if (pf_start(pf_current, ATAPI_READ_10, pf_block, pf_run)) {
928 pi_disconnect(pf_current->pi);
929 if (pf_retries < PF_MAX_RETRIES) {
930 pf_retries++;
931 pi_do_claimed(pf_current->pi, do_pf_read_start);
932 return;
933 }
934 next_request(BLK_STS_IOERR);
935 return;
936 }
937 pf_mask = STAT_DRQ;
938 ps_set_intr(do_pf_read_drq, pf_ready, PF_TMO, nice);
939 }
940
941 static void do_pf_read_drq(void)
942 {
943 while (1) {
944 if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
945 "read block", "completion") & STAT_ERR) {
946 pi_disconnect(pf_current->pi);
947 if (pf_retries < PF_MAX_RETRIES) {
948 pf_req_sense(pf_current, 0);
949 pf_retries++;
950 pi_do_claimed(pf_current->pi, do_pf_read_start);
951 return;
952 }
953 next_request(BLK_STS_IOERR);
954 return;
955 }
956 pi_read_block(pf_current->pi, pf_buf, 512);
957 if (pf_next_buf())
958 break;
959 }
960 pi_disconnect(pf_current->pi);
961 next_request(0);
962 }
963
964 static void do_pf_write(void)
965 {
966 ps_set_intr(do_pf_write_start, NULL, 0, nice);
967 }
968
969 static void do_pf_write_start(void)
970 {
971 pf_busy = 1;
972
973 if (pf_start(pf_current, ATAPI_WRITE_10, pf_block, pf_run)) {
974 pi_disconnect(pf_current->pi);
975 if (pf_retries < PF_MAX_RETRIES) {
976 pf_retries++;
977 pi_do_claimed(pf_current->pi, do_pf_write_start);
978 return;
979 }
980 next_request(BLK_STS_IOERR);
981 return;
982 }
983
984 while (1) {
985 if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
986 "write block", "data wait") & STAT_ERR) {
987 pi_disconnect(pf_current->pi);
988 if (pf_retries < PF_MAX_RETRIES) {
989 pf_retries++;
990 pi_do_claimed(pf_current->pi, do_pf_write_start);
991 return;
992 }
993 next_request(BLK_STS_IOERR);
994 return;
995 }
996 pi_write_block(pf_current->pi, pf_buf, 512);
997 if (pf_next_buf())
998 break;
999 }
1000 pf_mask = 0;
1001 ps_set_intr(do_pf_write_done, pf_ready, PF_TMO, nice);
1002 }
1003
1004 static void do_pf_write_done(void)
1005 {
1006 if (pf_wait(pf_current, STAT_BUSY, 0, "write block", "done") & STAT_ERR) {
1007 pi_disconnect(pf_current->pi);
1008 if (pf_retries < PF_MAX_RETRIES) {
1009 pf_retries++;
1010 pi_do_claimed(pf_current->pi, do_pf_write_start);
1011 return;
1012 }
1013 next_request(BLK_STS_IOERR);
1014 return;
1015 }
1016 pi_disconnect(pf_current->pi);
1017 next_request(0);
1018 }
1019
1020 static int __init pf_init(void)
1021 {
1022 struct pf_unit *pf;
1023 int unit;
1024
1025 if (disable)
1026 return -EINVAL;
1027
1028 pf_init_units();
1029
1030 if (pf_detect())
1031 return -ENODEV;
1032 pf_busy = 0;
1033
1034 if (register_blkdev(major, name)) {
1035 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
1036 if (!pf->disk)
1037 continue;
1038 blk_cleanup_queue(pf->disk->queue);
1039 blk_mq_free_tag_set(&pf->tag_set);
1040 put_disk(pf->disk);
1041 }
1042 return -EBUSY;
1043 }
1044
1045 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
1046 struct gendisk *disk = pf->disk;
1047
1048 if (!pf->present)
1049 continue;
1050 disk->private_data = pf;
1051 add_disk(disk);
1052 }
1053 return 0;
1054 }
1055
1056 static void __exit pf_exit(void)
1057 {
1058 struct pf_unit *pf;
1059 int unit;
1060 unregister_blkdev(major, name);
1061 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
1062 if (!pf->disk)
1063 continue;
1064
1065 if (pf->present)
1066 del_gendisk(pf->disk);
1067
1068 blk_cleanup_queue(pf->disk->queue);
1069 blk_mq_free_tag_set(&pf->tag_set);
1070 put_disk(pf->disk);
1071
1072 if (pf->present)
1073 pi_release(pf->pi);
1074 }
1075 }
1076
1077 MODULE_LICENSE("GPL");
1078 module_init(pf_init)
1079 module_exit(pf_exit)