0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/init.h>
0013 #include <linux/kernel.h>
0014 #include <linux/module.h>
0015 #include <linux/blkdev.h>
0016 #include <linux/parport.h>
0017 #include <linux/workqueue.h>
0018 #include <linux/delay.h>
0019 #include <linux/slab.h>
0020 #include <asm/io.h>
0021
0022 #include <scsi/scsi.h>
0023 #include <scsi/scsi_cmnd.h>
0024 #include <scsi/scsi_device.h>
0025 #include <scsi/scsi_host.h>
0026
0027
0028 #define IMM_PROBE_SPP 0x0001
0029 #define IMM_PROBE_PS2 0x0002
0030 #define IMM_PROBE_ECR 0x0010
0031 #define IMM_PROBE_EPP17 0x0100
0032 #define IMM_PROBE_EPP19 0x0200
0033
0034
0035 typedef struct {
0036 struct pardevice *dev;
0037 int base;
0038 int base_hi;
0039 int mode;
0040 struct scsi_cmnd *cur_cmd;
0041 struct delayed_work imm_tq;
0042 unsigned long jstart;
0043 unsigned failed:1;
0044 unsigned dp:1;
0045 unsigned rd:1;
0046 unsigned wanted:1;
0047 unsigned int dev_no;
0048 wait_queue_head_t *waiting;
0049 struct Scsi_Host *host;
0050 struct list_head list;
0051 } imm_struct;
0052
0053 static void imm_reset_pulse(unsigned int base);
0054 static int device_check(imm_struct *dev);
0055
0056 #include "imm.h"
0057
0058 static inline imm_struct *imm_dev(struct Scsi_Host *host)
0059 {
0060 return *(imm_struct **)&host->hostdata;
0061 }
0062
0063 static DEFINE_SPINLOCK(arbitration_lock);
0064
0065 static void got_it(imm_struct *dev)
0066 {
0067 dev->base = dev->dev->port->base;
0068 if (dev->cur_cmd)
0069 imm_scsi_pointer(dev->cur_cmd)->phase = 1;
0070 else
0071 wake_up(dev->waiting);
0072 }
0073
0074 static void imm_wakeup(void *ref)
0075 {
0076 imm_struct *dev = (imm_struct *) ref;
0077 unsigned long flags;
0078
0079 spin_lock_irqsave(&arbitration_lock, flags);
0080 if (dev->wanted) {
0081 if (parport_claim(dev->dev) == 0) {
0082 got_it(dev);
0083 dev->wanted = 0;
0084 }
0085 }
0086 spin_unlock_irqrestore(&arbitration_lock, flags);
0087 }
0088
0089 static int imm_pb_claim(imm_struct *dev)
0090 {
0091 unsigned long flags;
0092 int res = 1;
0093 spin_lock_irqsave(&arbitration_lock, flags);
0094 if (parport_claim(dev->dev) == 0) {
0095 got_it(dev);
0096 res = 0;
0097 }
0098 dev->wanted = res;
0099 spin_unlock_irqrestore(&arbitration_lock, flags);
0100 return res;
0101 }
0102
0103 static void imm_pb_dismiss(imm_struct *dev)
0104 {
0105 unsigned long flags;
0106 int wanted;
0107 spin_lock_irqsave(&arbitration_lock, flags);
0108 wanted = dev->wanted;
0109 dev->wanted = 0;
0110 spin_unlock_irqrestore(&arbitration_lock, flags);
0111 if (!wanted)
0112 parport_release(dev->dev);
0113 }
0114
0115 static inline void imm_pb_release(imm_struct *dev)
0116 {
0117 parport_release(dev->dev);
0118 }
0119
0120
0121
0122
0123
0124
0125
0126
0127 static int imm_write_info(struct Scsi_Host *host, char *buffer, int length)
0128 {
0129 imm_struct *dev = imm_dev(host);
0130
0131 if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
0132 dev->mode = simple_strtoul(buffer + 5, NULL, 0);
0133 return length;
0134 }
0135 printk("imm /proc: invalid variable\n");
0136 return -EINVAL;
0137 }
0138
0139 static int imm_show_info(struct seq_file *m, struct Scsi_Host *host)
0140 {
0141 imm_struct *dev = imm_dev(host);
0142
0143 seq_printf(m, "Version : %s\n", IMM_VERSION);
0144 seq_printf(m, "Parport : %s\n", dev->dev->port->name);
0145 seq_printf(m, "Mode : %s\n", IMM_MODE_STRING[dev->mode]);
0146 return 0;
0147 }
0148
0149 #if IMM_DEBUG > 0
0150 #define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %d\n",\
0151 y, __func__, __LINE__); imm_fail_func(x,y);
0152 static inline void
0153 imm_fail_func(imm_struct *dev, int error_code)
0154 #else
0155 static inline void
0156 imm_fail(imm_struct *dev, int error_code)
0157 #endif
0158 {
0159
0160 if (dev->cur_cmd) {
0161 dev->cur_cmd->result = error_code << 16;
0162 dev->failed = 1;
0163 }
0164 }
0165
0166
0167
0168
0169
0170
0171
0172
0173 static unsigned char imm_wait(imm_struct *dev)
0174 {
0175 int k;
0176 unsigned short ppb = dev->base;
0177 unsigned char r;
0178
0179 w_ctr(ppb, 0x0c);
0180
0181 k = IMM_SPIN_TMO;
0182 do {
0183 r = r_str(ppb);
0184 k--;
0185 udelay(1);
0186 }
0187 while (!(r & 0x80) && (k));
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208 w_ctr(ppb, 0x04);
0209 if (k)
0210 return (r & 0xb8);
0211
0212
0213 imm_fail(dev, DID_TIME_OUT);
0214 printk("imm timeout in imm_wait\n");
0215 return 0;
0216 }
0217
0218 static int imm_negotiate(imm_struct * tmp)
0219 {
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232 unsigned short base = tmp->base;
0233 unsigned char a, mode;
0234
0235 switch (tmp->mode) {
0236 case IMM_NIBBLE:
0237 mode = 0x00;
0238 break;
0239 case IMM_PS2:
0240 mode = 0x01;
0241 break;
0242 default:
0243 return 0;
0244 }
0245
0246 w_ctr(base, 0x04);
0247 udelay(5);
0248 w_dtr(base, mode);
0249 udelay(100);
0250 w_ctr(base, 0x06);
0251 udelay(5);
0252 a = (r_str(base) & 0x20) ? 0 : 1;
0253 udelay(5);
0254 w_ctr(base, 0x07);
0255 udelay(5);
0256 w_ctr(base, 0x06);
0257
0258 if (a) {
0259 printk
0260 ("IMM: IEEE1284 negotiate indicates no data available.\n");
0261 imm_fail(tmp, DID_ERROR);
0262 }
0263 return a;
0264 }
0265
0266
0267
0268
0269 static inline void epp_reset(unsigned short ppb)
0270 {
0271 int i;
0272
0273 i = r_str(ppb);
0274 w_str(ppb, i);
0275 w_str(ppb, i & 0xfe);
0276 }
0277
0278
0279
0280
0281 static inline void ecp_sync(imm_struct *dev)
0282 {
0283 int i, ppb_hi = dev->base_hi;
0284
0285 if (ppb_hi == 0)
0286 return;
0287
0288 if ((r_ecr(ppb_hi) & 0xe0) == 0x60) {
0289 for (i = 0; i < 100; i++) {
0290 if (r_ecr(ppb_hi) & 0x01)
0291 return;
0292 udelay(5);
0293 }
0294 printk("imm: ECP sync failed as data still present in FIFO.\n");
0295 }
0296 }
0297
0298 static int imm_byte_out(unsigned short base, const char *buffer, int len)
0299 {
0300 int i;
0301
0302 w_ctr(base, 0x4);
0303 for (i = len >> 1; i; i--) {
0304 w_dtr(base, *buffer++);
0305 w_ctr(base, 0x5);
0306 w_dtr(base, *buffer++);
0307 w_ctr(base, 0x0);
0308 }
0309 w_ctr(base, 0x4);
0310 return 1;
0311 }
0312
0313 static int imm_nibble_in(unsigned short base, char *buffer, int len)
0314 {
0315 unsigned char l;
0316 int i;
0317
0318
0319
0320
0321 w_ctr(base, 0x4);
0322 for (i = len; i; i--) {
0323 w_ctr(base, 0x6);
0324 l = (r_str(base) & 0xf0) >> 4;
0325 w_ctr(base, 0x5);
0326 *buffer++ = (r_str(base) & 0xf0) | l;
0327 w_ctr(base, 0x4);
0328 }
0329 return 1;
0330 }
0331
0332 static int imm_byte_in(unsigned short base, char *buffer, int len)
0333 {
0334 int i;
0335
0336
0337
0338
0339 w_ctr(base, 0x4);
0340 for (i = len; i; i--) {
0341 w_ctr(base, 0x26);
0342 *buffer++ = r_dtr(base);
0343 w_ctr(base, 0x25);
0344 }
0345 return 1;
0346 }
0347
0348 static int imm_out(imm_struct *dev, char *buffer, int len)
0349 {
0350 unsigned short ppb = dev->base;
0351 int r = imm_wait(dev);
0352
0353
0354
0355
0356
0357
0358 if ((r & 0x18) != 0x08) {
0359 imm_fail(dev, DID_ERROR);
0360 printk("IMM: returned SCSI status %2x\n", r);
0361 return 0;
0362 }
0363 switch (dev->mode) {
0364 case IMM_EPP_32:
0365 case IMM_EPP_16:
0366 case IMM_EPP_8:
0367 epp_reset(ppb);
0368 w_ctr(ppb, 0x4);
0369 #ifdef CONFIG_SCSI_IZIP_EPP16
0370 if (!(((long) buffer | len) & 0x01))
0371 outsw(ppb + 4, buffer, len >> 1);
0372 #else
0373 if (!(((long) buffer | len) & 0x03))
0374 outsl(ppb + 4, buffer, len >> 2);
0375 #endif
0376 else
0377 outsb(ppb + 4, buffer, len);
0378 w_ctr(ppb, 0xc);
0379 r = !(r_str(ppb) & 0x01);
0380 w_ctr(ppb, 0xc);
0381 ecp_sync(dev);
0382 break;
0383
0384 case IMM_NIBBLE:
0385 case IMM_PS2:
0386
0387 r = imm_byte_out(ppb, buffer, len);
0388 break;
0389
0390 default:
0391 printk("IMM: bug in imm_out()\n");
0392 r = 0;
0393 }
0394 return r;
0395 }
0396
0397 static int imm_in(imm_struct *dev, char *buffer, int len)
0398 {
0399 unsigned short ppb = dev->base;
0400 int r = imm_wait(dev);
0401
0402
0403
0404
0405
0406
0407 if ((r & 0x18) != 0x18) {
0408 imm_fail(dev, DID_ERROR);
0409 return 0;
0410 }
0411 switch (dev->mode) {
0412 case IMM_NIBBLE:
0413
0414 r = imm_nibble_in(ppb, buffer, len);
0415 w_ctr(ppb, 0xc);
0416 break;
0417
0418 case IMM_PS2:
0419
0420 r = imm_byte_in(ppb, buffer, len);
0421 w_ctr(ppb, 0xc);
0422 break;
0423
0424 case IMM_EPP_32:
0425 case IMM_EPP_16:
0426 case IMM_EPP_8:
0427 epp_reset(ppb);
0428 w_ctr(ppb, 0x24);
0429 #ifdef CONFIG_SCSI_IZIP_EPP16
0430 if (!(((long) buffer | len) & 0x01))
0431 insw(ppb + 4, buffer, len >> 1);
0432 #else
0433 if (!(((long) buffer | len) & 0x03))
0434 insl(ppb + 4, buffer, len >> 2);
0435 #endif
0436 else
0437 insb(ppb + 4, buffer, len);
0438 w_ctr(ppb, 0x2c);
0439 r = !(r_str(ppb) & 0x01);
0440 w_ctr(ppb, 0x2c);
0441 ecp_sync(dev);
0442 break;
0443
0444 default:
0445 printk("IMM: bug in imm_ins()\n");
0446 r = 0;
0447 break;
0448 }
0449 return r;
0450 }
0451
0452 static int imm_cpp(unsigned short ppb, unsigned char b)
0453 {
0454
0455
0456
0457
0458
0459 unsigned char s1, s2, s3;
0460 w_ctr(ppb, 0x0c);
0461 udelay(2);
0462 w_dtr(ppb, 0xaa);
0463 udelay(10);
0464 w_dtr(ppb, 0x55);
0465 udelay(10);
0466 w_dtr(ppb, 0x00);
0467 udelay(10);
0468 w_dtr(ppb, 0xff);
0469 udelay(10);
0470 s1 = r_str(ppb) & 0xb8;
0471 w_dtr(ppb, 0x87);
0472 udelay(10);
0473 s2 = r_str(ppb) & 0xb8;
0474 w_dtr(ppb, 0x78);
0475 udelay(10);
0476 s3 = r_str(ppb) & 0x38;
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487 w_dtr(ppb, b);
0488 udelay(2);
0489 w_ctr(ppb, 0x0c);
0490 udelay(10);
0491 w_ctr(ppb, 0x0d);
0492 udelay(2);
0493 w_ctr(ppb, 0x0c);
0494 udelay(10);
0495 w_dtr(ppb, 0xff);
0496 udelay(10);
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514 if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x30))
0515 return 1;
0516 if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x38))
0517 return 0;
0518
0519 return -1;
0520 }
0521
0522 static inline int imm_connect(imm_struct *dev, int flag)
0523 {
0524 unsigned short ppb = dev->base;
0525
0526 imm_cpp(ppb, 0xe0);
0527 imm_cpp(ppb, 0x30);
0528
0529 if ((dev->mode == IMM_EPP_8) ||
0530 (dev->mode == IMM_EPP_16) ||
0531 (dev->mode == IMM_EPP_32))
0532 return imm_cpp(ppb, 0x28);
0533 return imm_cpp(ppb, 0xe0);
0534 }
0535
0536 static void imm_disconnect(imm_struct *dev)
0537 {
0538 imm_cpp(dev->base, 0x30);
0539 }
0540
0541 static int imm_select(imm_struct *dev, int target)
0542 {
0543 int k;
0544 unsigned short ppb = dev->base;
0545
0546
0547
0548
0549
0550 w_ctr(ppb, 0xc);
0551
0552 k = IMM_SELECT_TMO;
0553 do {
0554 k--;
0555 } while ((r_str(ppb) & 0x08) && (k));
0556
0557 if (!k)
0558 return 0;
0559
0560
0561
0562
0563 w_ctr(ppb, 0x4);
0564 w_dtr(ppb, 0x80 | (1 << target));
0565 udelay(1);
0566
0567
0568
0569
0570 w_ctr(ppb, 0xc);
0571 w_ctr(ppb, 0xd);
0572
0573
0574
0575
0576
0577 k = IMM_SELECT_TMO;
0578 do {
0579 k--;
0580 }
0581 while (!(r_str(ppb) & 0x08) && (k));
0582
0583
0584
0585
0586 w_ctr(ppb, 0xc);
0587 return (k) ? 1 : 0;
0588 }
0589
0590 static int imm_init(imm_struct *dev)
0591 {
0592 if (imm_connect(dev, 0) != 1)
0593 return -EIO;
0594 imm_reset_pulse(dev->base);
0595 mdelay(1);
0596 imm_disconnect(dev);
0597 mdelay(1);
0598 return device_check(dev);
0599 }
0600
0601 static inline int imm_send_command(struct scsi_cmnd *cmd)
0602 {
0603 imm_struct *dev = imm_dev(cmd->device->host);
0604 int k;
0605
0606
0607 for (k = 0; k < cmd->cmd_len; k += 2)
0608 if (!imm_out(dev, &cmd->cmnd[k], 2))
0609 return 0;
0610 return 1;
0611 }
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621 static int imm_completion(struct scsi_cmnd *const cmd)
0622 {
0623
0624
0625
0626
0627
0628 struct scsi_pointer *scsi_pointer = imm_scsi_pointer(cmd);
0629 imm_struct *dev = imm_dev(cmd->device->host);
0630 unsigned short ppb = dev->base;
0631 unsigned long start_jiffies = jiffies;
0632
0633 unsigned char r, v;
0634 int fast, bulk, status;
0635
0636 v = cmd->cmnd[0];
0637 bulk = ((v == READ_6) ||
0638 (v == READ_10) || (v == WRITE_6) || (v == WRITE_10));
0639
0640
0641
0642
0643
0644 w_ctr(ppb, 0x0c);
0645 r = (r_str(ppb) & 0xb8);
0646
0647
0648
0649
0650
0651 while (r != (unsigned char) 0xb8) {
0652
0653
0654
0655
0656 if (time_after(jiffies, start_jiffies + 1))
0657 return 0;
0658
0659
0660
0661
0662
0663
0664 if ((r & 0x88) != 0x88 || scsi_pointer->this_residual <= 0) {
0665 imm_fail(dev, DID_ERROR);
0666 return -1;
0667 }
0668
0669 if (dev->rd == 0) {
0670 fast = bulk && scsi_pointer->this_residual >=
0671 IMM_BURST_SIZE ? IMM_BURST_SIZE : 2;
0672 status = imm_out(dev, scsi_pointer->ptr, fast);
0673 } else {
0674 fast = bulk && scsi_pointer->this_residual >=
0675 IMM_BURST_SIZE ? IMM_BURST_SIZE : 1;
0676 status = imm_in(dev, scsi_pointer->ptr, fast);
0677 }
0678
0679 scsi_pointer->ptr += fast;
0680 scsi_pointer->this_residual -= fast;
0681
0682 if (!status) {
0683 imm_fail(dev, DID_BUS_BUSY);
0684 return -1;
0685 }
0686 if (scsi_pointer->buffer && !scsi_pointer->this_residual) {
0687
0688 if (scsi_pointer->buffers_residual--) {
0689 scsi_pointer->buffer =
0690 sg_next(scsi_pointer->buffer);
0691 scsi_pointer->this_residual =
0692 scsi_pointer->buffer->length;
0693 scsi_pointer->ptr = sg_virt(scsi_pointer->buffer);
0694
0695
0696
0697
0698
0699 if (scsi_pointer->this_residual & 0x01)
0700 scsi_pointer->this_residual++;
0701 }
0702 }
0703
0704 w_ctr(ppb, 0x0c);
0705 r = (r_str(ppb) & 0xb8);
0706
0707
0708 if (!(r & 0x80))
0709 return 0;
0710 }
0711 return 1;
0712 }
0713
0714
0715
0716
0717
0718
0719 static void imm_interrupt(struct work_struct *work)
0720 {
0721 imm_struct *dev = container_of(work, imm_struct, imm_tq.work);
0722 struct scsi_cmnd *cmd = dev->cur_cmd;
0723 struct Scsi_Host *host = cmd->device->host;
0724 unsigned long flags;
0725
0726 if (imm_engine(dev, cmd)) {
0727 schedule_delayed_work(&dev->imm_tq, 1);
0728 return;
0729 }
0730
0731 #if IMM_DEBUG > 0
0732 switch ((cmd->result >> 16) & 0xff) {
0733 case DID_OK:
0734 break;
0735 case DID_NO_CONNECT:
0736 printk("imm: no device at SCSI ID %i\n", cmd->device->id);
0737 break;
0738 case DID_BUS_BUSY:
0739 printk("imm: BUS BUSY - EPP timeout detected\n");
0740 break;
0741 case DID_TIME_OUT:
0742 printk("imm: unknown timeout\n");
0743 break;
0744 case DID_ABORT:
0745 printk("imm: told to abort\n");
0746 break;
0747 case DID_PARITY:
0748 printk("imm: parity error (???)\n");
0749 break;
0750 case DID_ERROR:
0751 printk("imm: internal driver error\n");
0752 break;
0753 case DID_RESET:
0754 printk("imm: told to reset device\n");
0755 break;
0756 case DID_BAD_INTR:
0757 printk("imm: bad interrupt (???)\n");
0758 break;
0759 default:
0760 printk("imm: bad return code (%02x)\n",
0761 (cmd->result >> 16) & 0xff);
0762 }
0763 #endif
0764
0765 if (imm_scsi_pointer(cmd)->phase > 1)
0766 imm_disconnect(dev);
0767
0768 imm_pb_dismiss(dev);
0769
0770 spin_lock_irqsave(host->host_lock, flags);
0771 dev->cur_cmd = NULL;
0772 scsi_done(cmd);
0773 spin_unlock_irqrestore(host->host_lock, flags);
0774 return;
0775 }
0776
0777 static int imm_engine(imm_struct *dev, struct scsi_cmnd *const cmd)
0778 {
0779 struct scsi_pointer *scsi_pointer = imm_scsi_pointer(cmd);
0780 unsigned short ppb = dev->base;
0781 unsigned char l = 0, h = 0;
0782 int retv, x;
0783
0784
0785
0786
0787 if (dev->failed)
0788 return 0;
0789
0790 switch (scsi_pointer->phase) {
0791 case 0:
0792 if (time_after(jiffies, dev->jstart + HZ)) {
0793
0794
0795
0796
0797 imm_fail(dev, DID_BUS_BUSY);
0798 return 0;
0799 }
0800 return 1;
0801
0802 case 1:
0803 imm_connect(dev, CONNECT_EPP_MAYBE);
0804 scsi_pointer->phase++;
0805 fallthrough;
0806
0807 case 2:
0808 if (!imm_select(dev, scmd_id(cmd))) {
0809 imm_fail(dev, DID_NO_CONNECT);
0810 return 0;
0811 }
0812 scsi_pointer->phase++;
0813 fallthrough;
0814
0815 case 3:
0816 w_ctr(ppb, 0x0c);
0817 if (!(r_str(ppb) & 0x80))
0818 return 1;
0819
0820 if (!imm_send_command(cmd))
0821 return 0;
0822 scsi_pointer->phase++;
0823 fallthrough;
0824
0825 case 4:
0826 if (scsi_bufflen(cmd)) {
0827 scsi_pointer->buffer = scsi_sglist(cmd);
0828 scsi_pointer->this_residual = scsi_pointer->buffer->length;
0829 scsi_pointer->ptr = sg_virt(scsi_pointer->buffer);
0830 } else {
0831 scsi_pointer->buffer = NULL;
0832 scsi_pointer->this_residual = 0;
0833 scsi_pointer->ptr = NULL;
0834 }
0835 scsi_pointer->buffers_residual = scsi_sg_count(cmd) - 1;
0836 scsi_pointer->phase++;
0837 if (scsi_pointer->this_residual & 0x01)
0838 scsi_pointer->this_residual++;
0839 fallthrough;
0840
0841 case 5:
0842
0843 w_ctr(ppb, 0x0c);
0844 if (!(r_str(ppb) & 0x80))
0845 return 1;
0846
0847
0848 x = (r_str(ppb) & 0xb8);
0849 dev->rd = (x & 0x10) ? 1 : 0;
0850 dev->dp = (x & 0x20) ? 0 : 1;
0851
0852 if ((dev->dp) && (dev->rd))
0853 if (imm_negotiate(dev))
0854 return 0;
0855 scsi_pointer->phase++;
0856 fallthrough;
0857
0858 case 6:
0859
0860 w_ctr(ppb, 0x0c);
0861 if (!(r_str(ppb) & 0x80))
0862 return 1;
0863
0864 if (dev->dp) {
0865 retv = imm_completion(cmd);
0866 if (retv == -1)
0867 return 0;
0868 if (retv == 0)
0869 return 1;
0870 }
0871 scsi_pointer->phase++;
0872 fallthrough;
0873
0874 case 7:
0875 if ((dev->dp) && (dev->rd)) {
0876 if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) {
0877 w_ctr(ppb, 0x4);
0878 w_ctr(ppb, 0xc);
0879 w_ctr(ppb, 0xe);
0880 w_ctr(ppb, 0x4);
0881 }
0882 }
0883 scsi_pointer->phase++;
0884 fallthrough;
0885
0886 case 8:
0887
0888 if (imm_wait(dev) != (unsigned char) 0xb8) {
0889 imm_fail(dev, DID_ERROR);
0890 return 0;
0891 }
0892 if (imm_negotiate(dev))
0893 return 0;
0894 if (imm_in(dev, &l, 1)) {
0895
0896 if (imm_wait(dev) == (unsigned char) 0xb8)
0897 imm_in(dev, &h, 1);
0898 cmd->result = (DID_OK << 16) | (l & STATUS_MASK);
0899 }
0900 if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) {
0901 w_ctr(ppb, 0x4);
0902 w_ctr(ppb, 0xc);
0903 w_ctr(ppb, 0xe);
0904 w_ctr(ppb, 0x4);
0905 }
0906 return 0;
0907
0908 default:
0909 printk("imm: Invalid scsi phase\n");
0910 }
0911 return 0;
0912 }
0913
0914 static int imm_queuecommand_lck(struct scsi_cmnd *cmd)
0915 {
0916 imm_struct *dev = imm_dev(cmd->device->host);
0917
0918 if (dev->cur_cmd) {
0919 printk("IMM: bug in imm_queuecommand\n");
0920 return 0;
0921 }
0922 dev->failed = 0;
0923 dev->jstart = jiffies;
0924 dev->cur_cmd = cmd;
0925 cmd->result = DID_ERROR << 16;
0926 imm_scsi_pointer(cmd)->phase = 0;
0927
0928 schedule_delayed_work(&dev->imm_tq, 0);
0929
0930 imm_pb_claim(dev);
0931
0932 return 0;
0933 }
0934
0935 static DEF_SCSI_QCMD(imm_queuecommand)
0936
0937
0938
0939
0940
0941
0942
0943 static int imm_biosparam(struct scsi_device *sdev, struct block_device *dev,
0944 sector_t capacity, int ip[])
0945 {
0946 ip[0] = 0x40;
0947 ip[1] = 0x20;
0948 ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]);
0949 if (ip[2] > 1024) {
0950 ip[0] = 0xff;
0951 ip[1] = 0x3f;
0952 ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]);
0953 }
0954 return 0;
0955 }
0956
0957 static int imm_abort(struct scsi_cmnd *cmd)
0958 {
0959 imm_struct *dev = imm_dev(cmd->device->host);
0960
0961
0962
0963
0964
0965 switch (imm_scsi_pointer(cmd)->phase) {
0966 case 0:
0967 case 1:
0968 dev->cur_cmd = NULL;
0969 return SUCCESS;
0970 default:
0971 return FAILED;
0972 }
0973 }
0974
0975 static void imm_reset_pulse(unsigned int base)
0976 {
0977 w_ctr(base, 0x04);
0978 w_dtr(base, 0x40);
0979 udelay(1);
0980 w_ctr(base, 0x0c);
0981 w_ctr(base, 0x0d);
0982 udelay(50);
0983 w_ctr(base, 0x0c);
0984 w_ctr(base, 0x04);
0985 }
0986
0987 static int imm_reset(struct scsi_cmnd *cmd)
0988 {
0989 imm_struct *dev = imm_dev(cmd->device->host);
0990
0991 if (imm_scsi_pointer(cmd)->phase)
0992 imm_disconnect(dev);
0993 dev->cur_cmd = NULL;
0994
0995 imm_connect(dev, CONNECT_NORMAL);
0996 imm_reset_pulse(dev->base);
0997 mdelay(1);
0998 imm_disconnect(dev);
0999 mdelay(1);
1000 return SUCCESS;
1001 }
1002
1003 static int device_check(imm_struct *dev)
1004 {
1005
1006
1007
1008 static char cmd[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1009 int loop, old_mode, status, k, ppb = dev->base;
1010 unsigned char l;
1011
1012 old_mode = dev->mode;
1013 for (loop = 0; loop < 8; loop++) {
1014
1015 if ((ppb & 0x0007) == 0x0000)
1016 dev->mode = IMM_EPP_32;
1017
1018 second_pass:
1019 imm_connect(dev, CONNECT_EPP_MAYBE);
1020
1021 if (!imm_select(dev, loop)) {
1022 imm_disconnect(dev);
1023 continue;
1024 }
1025 printk("imm: Found device at ID %i, Attempting to use %s\n",
1026 loop, IMM_MODE_STRING[dev->mode]);
1027
1028
1029 status = 1;
1030 w_ctr(ppb, 0x0c);
1031 for (l = 0; (l < 3) && (status); l++)
1032 status = imm_out(dev, &cmd[l << 1], 2);
1033
1034 if (!status) {
1035 imm_disconnect(dev);
1036 imm_connect(dev, CONNECT_EPP_MAYBE);
1037 imm_reset_pulse(dev->base);
1038 udelay(1000);
1039 imm_disconnect(dev);
1040 udelay(1000);
1041 if (dev->mode == IMM_EPP_32) {
1042 dev->mode = old_mode;
1043 goto second_pass;
1044 }
1045 printk("imm: Unable to establish communication\n");
1046 return -EIO;
1047 }
1048 w_ctr(ppb, 0x0c);
1049
1050 k = 1000000;
1051 do {
1052 l = r_str(ppb);
1053 k--;
1054 udelay(1);
1055 } while (!(l & 0x80) && (k));
1056
1057 l &= 0xb8;
1058
1059 if (l != 0xb8) {
1060 imm_disconnect(dev);
1061 imm_connect(dev, CONNECT_EPP_MAYBE);
1062 imm_reset_pulse(dev->base);
1063 udelay(1000);
1064 imm_disconnect(dev);
1065 udelay(1000);
1066 if (dev->mode == IMM_EPP_32) {
1067 dev->mode = old_mode;
1068 goto second_pass;
1069 }
1070 printk
1071 ("imm: Unable to establish communication\n");
1072 return -EIO;
1073 }
1074 imm_disconnect(dev);
1075 printk
1076 ("imm: Communication established at 0x%x with ID %i using %s\n",
1077 ppb, loop, IMM_MODE_STRING[dev->mode]);
1078 imm_connect(dev, CONNECT_EPP_MAYBE);
1079 imm_reset_pulse(dev->base);
1080 udelay(1000);
1081 imm_disconnect(dev);
1082 udelay(1000);
1083 return 0;
1084 }
1085 printk("imm: No devices found\n");
1086 return -ENODEV;
1087 }
1088
1089
1090
1091
1092
1093 static int imm_adjust_queue(struct scsi_device *device)
1094 {
1095 blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
1096 return 0;
1097 }
1098
1099 static struct scsi_host_template imm_template = {
1100 .module = THIS_MODULE,
1101 .proc_name = "imm",
1102 .show_info = imm_show_info,
1103 .write_info = imm_write_info,
1104 .name = "Iomega VPI2 (imm) interface",
1105 .queuecommand = imm_queuecommand,
1106 .eh_abort_handler = imm_abort,
1107 .eh_host_reset_handler = imm_reset,
1108 .bios_param = imm_biosparam,
1109 .this_id = 7,
1110 .sg_tablesize = SG_ALL,
1111 .can_queue = 1,
1112 .slave_alloc = imm_adjust_queue,
1113 .cmd_size = sizeof(struct scsi_pointer),
1114 };
1115
1116
1117
1118
1119
1120 static LIST_HEAD(imm_hosts);
1121
1122
1123
1124
1125
1126
1127
1128 static inline imm_struct *find_parent(void)
1129 {
1130 imm_struct *dev, *par = NULL;
1131 unsigned int cnt = 0;
1132
1133 if (list_empty(&imm_hosts))
1134 return NULL;
1135
1136 list_for_each_entry(dev, &imm_hosts, list) {
1137 if (dev->dev_no != cnt)
1138 return par;
1139 cnt++;
1140 par = dev;
1141 }
1142
1143 return par;
1144 }
1145
1146 static int __imm_attach(struct parport *pb)
1147 {
1148 struct Scsi_Host *host;
1149 imm_struct *dev, *temp;
1150 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waiting);
1151 DEFINE_WAIT(wait);
1152 int ports;
1153 int modes, ppb;
1154 int err = -ENOMEM;
1155 struct pardev_cb imm_cb;
1156
1157 init_waitqueue_head(&waiting);
1158
1159 dev = kzalloc(sizeof(imm_struct), GFP_KERNEL);
1160 if (!dev)
1161 return -ENOMEM;
1162
1163
1164 dev->base = -1;
1165 dev->mode = IMM_AUTODETECT;
1166 INIT_LIST_HEAD(&dev->list);
1167
1168 temp = find_parent();
1169 if (temp)
1170 dev->dev_no = temp->dev_no + 1;
1171
1172 memset(&imm_cb, 0, sizeof(imm_cb));
1173 imm_cb.private = dev;
1174 imm_cb.wakeup = imm_wakeup;
1175
1176 dev->dev = parport_register_dev_model(pb, "imm", &imm_cb, dev->dev_no);
1177 if (!dev->dev)
1178 goto out;
1179
1180
1181
1182
1183
1184 err = -EBUSY;
1185 dev->waiting = &waiting;
1186 prepare_to_wait(&waiting, &wait, TASK_UNINTERRUPTIBLE);
1187 if (imm_pb_claim(dev))
1188 schedule_timeout(3 * HZ);
1189 if (dev->wanted) {
1190 printk(KERN_ERR "imm%d: failed to claim parport because "
1191 "a pardevice is owning the port for too long "
1192 "time!\n", pb->number);
1193 imm_pb_dismiss(dev);
1194 dev->waiting = NULL;
1195 finish_wait(&waiting, &wait);
1196 goto out1;
1197 }
1198 dev->waiting = NULL;
1199 finish_wait(&waiting, &wait);
1200 ppb = dev->base = dev->dev->port->base;
1201 dev->base_hi = dev->dev->port->base_hi;
1202 w_ctr(ppb, 0x0c);
1203 modes = dev->dev->port->modes;
1204
1205
1206
1207
1208 dev->mode = IMM_NIBBLE;
1209
1210 if (modes & PARPORT_MODE_TRISTATE)
1211 dev->mode = IMM_PS2;
1212
1213
1214
1215 err = imm_init(dev);
1216
1217 imm_pb_release(dev);
1218
1219 if (err)
1220 goto out1;
1221
1222
1223 if (dev->mode == IMM_NIBBLE || dev->mode == IMM_PS2)
1224 ports = 3;
1225 else
1226 ports = 8;
1227
1228 INIT_DELAYED_WORK(&dev->imm_tq, imm_interrupt);
1229
1230 err = -ENOMEM;
1231 host = scsi_host_alloc(&imm_template, sizeof(imm_struct *));
1232 if (!host)
1233 goto out1;
1234 host->io_port = pb->base;
1235 host->n_io_port = ports;
1236 host->dma_channel = -1;
1237 host->unique_id = pb->number;
1238 *(imm_struct **)&host->hostdata = dev;
1239 dev->host = host;
1240 if (!temp)
1241 list_add_tail(&dev->list, &imm_hosts);
1242 else
1243 list_add_tail(&dev->list, &temp->list);
1244 err = scsi_add_host(host, NULL);
1245 if (err)
1246 goto out2;
1247 scsi_scan_host(host);
1248 return 0;
1249
1250 out2:
1251 list_del_init(&dev->list);
1252 scsi_host_put(host);
1253 out1:
1254 parport_unregister_device(dev->dev);
1255 out:
1256 kfree(dev);
1257 return err;
1258 }
1259
1260 static void imm_attach(struct parport *pb)
1261 {
1262 __imm_attach(pb);
1263 }
1264
1265 static void imm_detach(struct parport *pb)
1266 {
1267 imm_struct *dev;
1268 list_for_each_entry(dev, &imm_hosts, list) {
1269 if (dev->dev->port == pb) {
1270 list_del_init(&dev->list);
1271 scsi_remove_host(dev->host);
1272 scsi_host_put(dev->host);
1273 parport_unregister_device(dev->dev);
1274 kfree(dev);
1275 break;
1276 }
1277 }
1278 }
1279
1280 static struct parport_driver imm_driver = {
1281 .name = "imm",
1282 .match_port = imm_attach,
1283 .detach = imm_detach,
1284 .devmodel = true,
1285 };
1286 module_parport_driver(imm_driver);
1287
1288 MODULE_LICENSE("GPL");