Lines Matching +full:strobe +full:- +full:sel
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* imm.c -- low level driver for the IOMEGA MatchMaker
38 int base_hi; /* Hi Base address for ECP-ISA chipset */
60 return *(imm_struct **)&host->hostdata; in imm_dev()
67 dev->base = dev->dev->port->base; in got_it()
68 if (dev->cur_cmd) in got_it()
69 dev->cur_cmd->SCp.phase = 1; in got_it()
71 wake_up(dev->waiting); in got_it()
80 if (dev->wanted) { in imm_wakeup()
81 if (parport_claim(dev->dev) == 0) { in imm_wakeup()
83 dev->wanted = 0; in imm_wakeup()
94 if (parport_claim(dev->dev) == 0) { in imm_pb_claim()
98 dev->wanted = res; in imm_pb_claim()
108 wanted = dev->wanted; in imm_pb_dismiss()
109 dev->wanted = 0; in imm_pb_dismiss()
112 parport_release(dev->dev); in imm_pb_dismiss()
117 parport_release(dev->dev); in imm_pb_release()
132 dev->mode = simple_strtoul(buffer + 5, NULL, 0); in imm_write_info()
136 return -EINVAL; in imm_write_info()
144 seq_printf(m, "Parport : %s\n", dev->dev->port->name); in imm_show_info()
145 seq_printf(m, "Mode : %s\n", IMM_MODE_STRING[dev->mode]); in imm_show_info()
160 if (dev->cur_cmd) { in imm_fail_func()
161 dev->cur_cmd->result = error_code << 16; in imm_fail_func()
162 dev->failed = 1; in imm_fail_func()
176 unsigned short ppb = dev->base; in imm_wait()
184 k--; in imm_wait()
212 /* Counter expired - Time out occurred */ in imm_wait()
221 * The following is supposedly the IEEE 1284-1994 negotiate in imm_negotiate()
232 unsigned short base = tmp->base; in imm_negotiate()
235 switch (tmp->mode) { in imm_negotiate()
283 int i, ppb_hi = dev->base_hi; in ecp_sync()
303 for (i = len >> 1; i; i--) { in imm_byte_out()
305 w_ctr(base, 0x5); /* Drop STROBE low */ in imm_byte_out()
307 w_ctr(base, 0x0); /* STROBE high + INIT low */ in imm_byte_out()
310 return 1; /* All went well - we hope! */ in imm_byte_out()
322 for (i = len; i; i--) { in imm_nibble_in()
329 return 1; /* All went well - we hope! */ in imm_nibble_in()
340 for (i = len; i; i--) { in imm_byte_in()
345 return 1; /* All went well - we hope! */ in imm_byte_in()
350 unsigned short ppb = dev->base; in imm_out()
363 switch (dev->mode) { in imm_out()
399 unsigned short ppb = dev->base; in imm_in()
411 switch (dev->mode) { in imm_in()
461 udelay(2); /* 1 usec - infinite */ in imm_cpp()
463 udelay(10); /* 7 usec - infinite */ in imm_cpp()
465 udelay(10); /* 7 usec - infinite */ in imm_cpp()
467 udelay(10); /* 7 usec - infinite */ in imm_cpp()
469 udelay(10); /* 7 usec - infinite */ in imm_cpp()
472 udelay(10); /* 7 usec - infinite */ in imm_cpp()
475 udelay(10); /* 7 usec - infinite */ in imm_cpp()
488 udelay(2); /* 1 usec - infinite */ in imm_cpp()
490 udelay(10); /* 7 usec - infinite */ in imm_cpp()
492 udelay(2); /* 1 usec - infinite */ in imm_cpp()
494 udelay(10); /* 7 usec - infinite */ in imm_cpp()
496 udelay(10); /* 7 usec - infinite */ in imm_cpp()
502 * BSY ACK POut SEL Fault in imm_cpp()
519 return -1; /* No device present */ in imm_cpp()
524 unsigned short ppb = dev->base; in imm_connect()
529 if ((dev->mode == IMM_EPP_8) || in imm_connect()
530 (dev->mode == IMM_EPP_16) || in imm_connect()
531 (dev->mode == IMM_EPP_32)) in imm_connect()
538 imm_cpp(dev->base, 0x30); /* Disconnect all devices */ in imm_disconnect()
544 unsigned short ppb = dev->base; in imm_select()
554 k--; in imm_select()
568 * Deassert SELIN first followed by STROBE in imm_select()
579 k--; in imm_select()
593 return -EIO; in imm_init()
594 imm_reset_pulse(dev->base); in imm_init()
603 imm_struct *dev = imm_dev(cmd->device->host); in imm_send_command()
607 for (k = 0; k < cmd->cmd_len; k += 2) in imm_send_command()
608 if (!imm_out(dev, &cmd->cmnd[k], 2)) in imm_send_command()
624 * -1 Error in imm_completion()
628 imm_struct *dev = imm_dev(cmd->device->host); in imm_completion()
629 unsigned short ppb = dev->base; in imm_completion()
635 v = cmd->cmnd[0]; in imm_completion()
663 if (((r & 0x88) != 0x88) || (cmd->SCp.this_residual <= 0)) { in imm_completion()
665 return -1; /* ERROR_RETURN */ in imm_completion()
668 if (dev->rd == 0) { in imm_completion()
670 && (cmd->SCp.this_residual >= in imm_completion()
672 status = imm_out(dev, cmd->SCp.ptr, fast); in imm_completion()
675 && (cmd->SCp.this_residual >= in imm_completion()
677 status = imm_in(dev, cmd->SCp.ptr, fast); in imm_completion()
680 cmd->SCp.ptr += fast; in imm_completion()
681 cmd->SCp.this_residual -= fast; in imm_completion()
685 return -1; /* ERROR_RETURN */ in imm_completion()
687 if (cmd->SCp.buffer && !cmd->SCp.this_residual) { in imm_completion()
689 if (cmd->SCp.buffers_residual--) { in imm_completion()
690 cmd->SCp.buffer = sg_next(cmd->SCp.buffer); in imm_completion()
691 cmd->SCp.this_residual = in imm_completion()
692 cmd->SCp.buffer->length; in imm_completion()
693 cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); in imm_completion()
699 if (cmd->SCp.this_residual & 0x01) in imm_completion()
700 cmd->SCp.this_residual++; in imm_completion()
716 * the scheduler's task queue to generate a stream of call-backs and
722 struct scsi_cmnd *cmd = dev->cur_cmd; in imm_interrupt()
723 struct Scsi_Host *host = cmd->device->host; in imm_interrupt()
727 schedule_delayed_work(&dev->imm_tq, 1); in imm_interrupt()
732 switch ((cmd->result >> 16) & 0xff) { in imm_interrupt()
736 printk("imm: no device at SCSI ID %i\n", cmd->device->id); in imm_interrupt()
739 printk("imm: BUS BUSY - EPP timeout detected\n"); in imm_interrupt()
761 (cmd->result >> 16) & 0xff); in imm_interrupt()
765 if (cmd->SCp.phase > 1) in imm_interrupt()
770 spin_lock_irqsave(host->host_lock, flags); in imm_interrupt()
771 dev->cur_cmd = NULL; in imm_interrupt()
772 cmd->scsi_done(cmd); in imm_interrupt()
773 spin_unlock_irqrestore(host->host_lock, flags); in imm_interrupt()
779 unsigned short ppb = dev->base; in imm_engine()
786 if (dev->failed) in imm_engine()
789 switch (cmd->SCp.phase) { in imm_engine()
790 case 0: /* Phase 0 - Waiting for parport */ in imm_engine()
791 if (time_after(jiffies, dev->jstart + HZ)) { in imm_engine()
801 case 1: /* Phase 1 - Connected */ in imm_engine()
803 cmd->SCp.phase++; in imm_engine()
806 case 2: /* Phase 2 - We are now talking to the scsi bus */ in imm_engine()
811 cmd->SCp.phase++; in imm_engine()
814 case 3: /* Phase 3 - Ready to accept a command */ in imm_engine()
821 cmd->SCp.phase++; in imm_engine()
824 case 4: /* Phase 4 - Setup scatter/gather buffers */ in imm_engine()
826 cmd->SCp.buffer = scsi_sglist(cmd); in imm_engine()
827 cmd->SCp.this_residual = cmd->SCp.buffer->length; in imm_engine()
828 cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); in imm_engine()
830 cmd->SCp.buffer = NULL; in imm_engine()
831 cmd->SCp.this_residual = 0; in imm_engine()
832 cmd->SCp.ptr = NULL; in imm_engine()
834 cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1; in imm_engine()
835 cmd->SCp.phase++; in imm_engine()
836 if (cmd->SCp.this_residual & 0x01) in imm_engine()
837 cmd->SCp.this_residual++; in imm_engine()
840 case 5: /* Phase 5 - Pre-Data transfer stage */ in imm_engine()
848 dev->rd = (x & 0x10) ? 1 : 0; in imm_engine()
849 dev->dp = (x & 0x20) ? 0 : 1; in imm_engine()
851 if ((dev->dp) && (dev->rd)) in imm_engine()
854 cmd->SCp.phase++; in imm_engine()
857 case 6: /* Phase 6 - Data transfer stage */ in imm_engine()
863 if (dev->dp) { in imm_engine()
865 if (retv == -1) in imm_engine()
870 cmd->SCp.phase++; in imm_engine()
873 case 7: /* Phase 7 - Post data transfer stage */ in imm_engine()
874 if ((dev->dp) && (dev->rd)) { in imm_engine()
875 if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) { in imm_engine()
882 cmd->SCp.phase++; in imm_engine()
885 case 8: /* Phase 8 - Read status/message */ in imm_engine()
897 cmd->result = (DID_OK << 16) | (l & STATUS_MASK); in imm_engine()
899 if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) { in imm_engine()
916 imm_struct *dev = imm_dev(cmd->device->host); in imm_queuecommand_lck()
918 if (dev->cur_cmd) { in imm_queuecommand_lck()
922 dev->failed = 0; in imm_queuecommand_lck()
923 dev->jstart = jiffies; in imm_queuecommand_lck()
924 dev->cur_cmd = cmd; in imm_queuecommand_lck()
925 cmd->scsi_done = done; in imm_queuecommand_lck()
926 cmd->result = DID_ERROR << 16; /* default return code */ in imm_queuecommand_lck()
927 cmd->SCp.phase = 0; /* bus free */ in imm_queuecommand_lck()
929 schedule_delayed_work(&dev->imm_tq, 0); in imm_queuecommand_lck()
939 * Apparently the disk->capacity attribute is off by 1 sector in DEF_SCSI_QCMD()
960 imm_struct *dev = imm_dev(cmd->device->host); in imm_abort()
966 switch (cmd->SCp.phase) { in imm_abort()
969 dev->cur_cmd = NULL; /* Forget the problem */ in imm_abort()
990 imm_struct *dev = imm_dev(cmd->device->host); in imm_reset()
992 if (cmd->SCp.phase) in imm_reset()
994 dev->cur_cmd = NULL; /* Forget the problem */ in imm_reset()
997 imm_reset_pulse(dev->base); in imm_reset()
1010 int loop, old_mode, status, k, ppb = dev->base; in device_check()
1013 old_mode = dev->mode; in device_check()
1017 dev->mode = IMM_EPP_32; in device_check()
1027 loop, IMM_MODE_STRING[dev->mode]); in device_check()
1038 imm_reset_pulse(dev->base); in device_check()
1042 if (dev->mode == IMM_EPP_32) { in device_check()
1043 dev->mode = old_mode; in device_check()
1047 return -EIO; in device_check()
1054 k--; in device_check()
1063 imm_reset_pulse(dev->base); in device_check()
1067 if (dev->mode == IMM_EPP_32) { in device_check()
1068 dev->mode = old_mode; in device_check()
1073 return -EIO; in device_check()
1078 ppb, loop, IMM_MODE_STRING[dev->mode]); in device_check()
1080 imm_reset_pulse(dev->base); in device_check()
1087 return -ENODEV; in device_check()
1096 blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH); in imm_adjust_queue()
1137 if (dev->dev_no != cnt) in find_parent()
1154 int err = -ENOMEM; in __imm_attach()
1161 return -ENOMEM; in __imm_attach()
1164 dev->base = -1; in __imm_attach()
1165 dev->mode = IMM_AUTODETECT; in __imm_attach()
1166 INIT_LIST_HEAD(&dev->list); in __imm_attach()
1170 dev->dev_no = temp->dev_no + 1; in __imm_attach()
1176 dev->dev = parport_register_dev_model(pb, "imm", &imm_cb, dev->dev_no); in __imm_attach()
1177 if (!dev->dev) in __imm_attach()
1184 err = -EBUSY; in __imm_attach()
1185 dev->waiting = &waiting; in __imm_attach()
1189 if (dev->wanted) { in __imm_attach()
1192 "time!\n", pb->number); in __imm_attach()
1194 dev->waiting = NULL; in __imm_attach()
1198 dev->waiting = NULL; in __imm_attach()
1200 ppb = dev->base = dev->dev->port->base; in __imm_attach()
1201 dev->base_hi = dev->dev->port->base_hi; in __imm_attach()
1203 modes = dev->dev->port->modes; in __imm_attach()
1206 * This avoids a nasty if-then-else-if-... tree in __imm_attach()
1208 dev->mode = IMM_NIBBLE; in __imm_attach()
1211 dev->mode = IMM_PS2; in __imm_attach()
1223 if (dev->mode == IMM_NIBBLE || dev->mode == IMM_PS2) in __imm_attach()
1228 INIT_DELAYED_WORK(&dev->imm_tq, imm_interrupt); in __imm_attach()
1230 err = -ENOMEM; in __imm_attach()
1234 host->io_port = pb->base; in __imm_attach()
1235 host->n_io_port = ports; in __imm_attach()
1236 host->dma_channel = -1; in __imm_attach()
1237 host->unique_id = pb->number; in __imm_attach()
1238 *(imm_struct **)&host->hostdata = dev; in __imm_attach()
1239 dev->host = host; in __imm_attach()
1241 list_add_tail(&dev->list, &imm_hosts); in __imm_attach()
1243 list_add_tail(&dev->list, &temp->list); in __imm_attach()
1251 list_del_init(&dev->list); in __imm_attach()
1254 parport_unregister_device(dev->dev); in __imm_attach()
1269 if (dev->dev->port == pb) { in imm_detach()
1270 list_del_init(&dev->list); in imm_detach()
1271 scsi_remove_host(dev->host); in imm_detach()
1272 scsi_host_put(dev->host); in imm_detach()
1273 parport_unregister_device(dev->dev); in imm_detach()