Lines Matching full:esp

2 /* esp_scsi.c: ESP SCSI driver.
33 #define DRV_MODULE_NAME "esp"
58 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
63 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
68 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
73 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
78 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
83 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
88 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
93 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
98 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
103 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
108 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
113 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
116 #define esp_read8(REG) esp->ops->esp_read8(esp, REG)
117 #define esp_write8(VAL,REG) esp->ops->esp_write8(esp, VAL, REG)
119 static void esp_log_fill_regs(struct esp *esp, in esp_log_fill_regs() argument
122 p->sreg = esp->sreg; in esp_log_fill_regs()
123 p->seqreg = esp->seqreg; in esp_log_fill_regs()
124 p->sreg2 = esp->sreg2; in esp_log_fill_regs()
125 p->ireg = esp->ireg; in esp_log_fill_regs()
126 p->select_state = esp->select_state; in esp_log_fill_regs()
127 p->event = esp->event; in esp_log_fill_regs()
130 void scsi_esp_cmd(struct esp *esp, u8 val) in scsi_esp_cmd() argument
133 int idx = esp->esp_event_cur; in scsi_esp_cmd()
135 p = &esp->esp_event_log[idx]; in scsi_esp_cmd()
138 esp_log_fill_regs(esp, p); in scsi_esp_cmd()
140 esp->esp_event_cur = (idx + 1) & (ESP_EVENT_LOG_SZ - 1); in scsi_esp_cmd()
147 static void esp_send_dma_cmd(struct esp *esp, int len, int max_len, int cmd) in esp_send_dma_cmd() argument
149 if (esp->flags & ESP_FLAG_USE_FIFO) { in esp_send_dma_cmd()
152 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_send_dma_cmd()
154 esp_write8(esp->command_block[i], ESP_FDATA); in esp_send_dma_cmd()
155 scsi_esp_cmd(esp, cmd); in esp_send_dma_cmd()
157 if (esp->rev == FASHME) in esp_send_dma_cmd()
158 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_send_dma_cmd()
160 esp->ops->send_dma_cmd(esp, esp->command_block_dma, in esp_send_dma_cmd()
165 static void esp_event(struct esp *esp, u8 val) in esp_event() argument
168 int idx = esp->esp_event_cur; in esp_event()
170 p = &esp->esp_event_log[idx]; in esp_event()
173 esp_log_fill_regs(esp, p); in esp_event()
175 esp->esp_event_cur = (idx + 1) & (ESP_EVENT_LOG_SZ - 1); in esp_event()
177 esp->event = val; in esp_event()
180 static void esp_dump_cmd_log(struct esp *esp) in esp_dump_cmd_log() argument
182 int idx = esp->esp_event_cur; in esp_dump_cmd_log()
185 shost_printk(KERN_INFO, esp->host, "Dumping command log\n"); in esp_dump_cmd_log()
187 struct esp_event_ent *p = &esp->esp_event_log[idx]; in esp_dump_cmd_log()
189 shost_printk(KERN_INFO, esp->host, in esp_dump_cmd_log()
201 static void esp_flush_fifo(struct esp *esp) in esp_flush_fifo() argument
203 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_flush_fifo()
204 if (esp->rev == ESP236) { in esp_flush_fifo()
209 shost_printk(KERN_ALERT, esp->host, in esp_flush_fifo()
218 static void hme_read_fifo(struct esp *esp) in hme_read_fifo() argument
224 esp->fifo[idx++] = esp_read8(ESP_FDATA); in hme_read_fifo()
225 esp->fifo[idx++] = esp_read8(ESP_FDATA); in hme_read_fifo()
227 if (esp->sreg2 & ESP_STAT2_F1BYTE) { in hme_read_fifo()
229 esp->fifo[idx++] = esp_read8(ESP_FDATA); in hme_read_fifo()
230 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in hme_read_fifo()
232 esp->fifo_cnt = idx; in hme_read_fifo()
235 static void esp_set_all_config3(struct esp *esp, u8 val) in esp_set_all_config3() argument
240 esp->target[i].esp_config3 = val; in esp_set_all_config3()
243 /* Reset the ESP chip, _not_ the SCSI bus. */
244 static void esp_reset_esp(struct esp *esp) in esp_reset_esp() argument
246 /* Now reset the ESP chip */ in esp_reset_esp()
247 scsi_esp_cmd(esp, ESP_CMD_RC); in esp_reset_esp()
248 scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); in esp_reset_esp()
249 if (esp->rev == FAST) in esp_reset_esp()
251 scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); in esp_reset_esp()
254 * the ID-code for a fast ESP chip variants. in esp_reset_esp()
256 esp->max_period = ((35 * esp->ccycle) / 1000); in esp_reset_esp()
257 if (esp->rev == FAST) { in esp_reset_esp()
261 esp->rev = FAS236; in esp_reset_esp()
263 esp->rev = FASHME; /* Version is usually '5'. */ in esp_reset_esp()
265 esp->rev = FSC; in esp_reset_esp()
269 esp->rev = FAS100A; in esp_reset_esp()
271 esp->min_period = ((4 * esp->ccycle) / 1000); in esp_reset_esp()
273 esp->min_period = ((5 * esp->ccycle) / 1000); in esp_reset_esp()
275 if (esp->rev == FAS236) { in esp_reset_esp()
284 esp->rev = PCSCSI; in esp_reset_esp()
285 esp_write8(esp->config4, ESP_CFG4); in esp_reset_esp()
288 esp->max_period = (esp->max_period + 3)>>2; in esp_reset_esp()
289 esp->min_period = (esp->min_period + 3)>>2; in esp_reset_esp()
291 esp_write8(esp->config1, ESP_CFG1); in esp_reset_esp()
292 switch (esp->rev) { in esp_reset_esp()
298 esp_write8(esp->config2, ESP_CFG2); in esp_reset_esp()
303 esp_write8(esp->config2, ESP_CFG2); in esp_reset_esp()
304 esp->prev_cfg3 = esp->target[0].esp_config3; in esp_reset_esp()
305 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_reset_esp()
309 esp->config2 |= (ESP_CONFIG2_HME32 | ESP_CONFIG2_HMEFENAB); in esp_reset_esp()
315 esp_write8(esp->config2, ESP_CFG2); in esp_reset_esp()
316 if (esp->rev == FASHME) { in esp_reset_esp()
317 u8 cfg3 = esp->target[0].esp_config3; in esp_reset_esp()
320 if (esp->scsi_id >= 8) in esp_reset_esp()
322 esp_set_all_config3(esp, cfg3); in esp_reset_esp()
324 u32 cfg3 = esp->target[0].esp_config3; in esp_reset_esp()
327 esp_set_all_config3(esp, cfg3); in esp_reset_esp()
329 esp->prev_cfg3 = esp->target[0].esp_config3; in esp_reset_esp()
330 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_reset_esp()
331 if (esp->rev == FASHME) { in esp_reset_esp()
332 esp->radelay = 80; in esp_reset_esp()
334 if (esp->flags & ESP_FLAG_DIFFERENTIAL) in esp_reset_esp()
335 esp->radelay = 0; in esp_reset_esp()
337 esp->radelay = 96; in esp_reset_esp()
343 esp_write8(esp->config2, ESP_CFG2); in esp_reset_esp()
344 esp_set_all_config3(esp, in esp_reset_esp()
345 (esp->target[0].esp_config3 | in esp_reset_esp()
347 esp->prev_cfg3 = esp->target[0].esp_config3; in esp_reset_esp()
348 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_reset_esp()
349 esp->radelay = 32; in esp_reset_esp()
357 esp_write8(esp->cfact, ESP_CFACT); in esp_reset_esp()
359 esp->prev_stp = 0; in esp_reset_esp()
360 esp_write8(esp->prev_stp, ESP_STP); in esp_reset_esp()
362 esp->prev_soff = 0; in esp_reset_esp()
363 esp_write8(esp->prev_soff, ESP_SOFF); in esp_reset_esp()
365 esp_write8(esp->neg_defp, ESP_TIMEO); in esp_reset_esp()
372 static void esp_map_dma(struct esp *esp, struct scsi_cmnd *cmd) in esp_map_dma() argument
382 if (esp->flags & ESP_FLAG_NO_DMA_MAP) { in esp_map_dma()
431 static void esp_advance_dma(struct esp *esp, struct esp_cmd_entry *ent, in esp_advance_dma() argument
444 shost_printk(KERN_ERR, esp->host, in esp_advance_dma()
446 shost_printk(KERN_ERR, esp->host, in esp_advance_dma()
459 static void esp_unmap_dma(struct esp *esp, struct scsi_cmnd *cmd) in esp_unmap_dma() argument
461 if (!(esp->flags & ESP_FLAG_NO_DMA_MAP)) in esp_unmap_dma()
465 static void esp_save_pointers(struct esp *esp, struct esp_cmd_entry *ent) in esp_save_pointers() argument
480 static void esp_restore_pointers(struct esp *esp, struct esp_cmd_entry *ent) in esp_restore_pointers() argument
495 static void esp_write_tgt_config3(struct esp *esp, int tgt) in esp_write_tgt_config3() argument
497 if (esp->rev > ESP100A) { in esp_write_tgt_config3()
498 u8 val = esp->target[tgt].esp_config3; in esp_write_tgt_config3()
500 if (val != esp->prev_cfg3) { in esp_write_tgt_config3()
501 esp->prev_cfg3 = val; in esp_write_tgt_config3()
507 static void esp_write_tgt_sync(struct esp *esp, int tgt) in esp_write_tgt_sync() argument
509 u8 off = esp->target[tgt].esp_offset; in esp_write_tgt_sync()
510 u8 per = esp->target[tgt].esp_period; in esp_write_tgt_sync()
512 if (off != esp->prev_soff) { in esp_write_tgt_sync()
513 esp->prev_soff = off; in esp_write_tgt_sync()
516 if (per != esp->prev_stp) { in esp_write_tgt_sync()
517 esp->prev_stp = per; in esp_write_tgt_sync()
522 static u32 esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32 dma_len) in esp_dma_length_limit() argument
524 if (esp->rev == FASHME) { in esp_dma_length_limit()
531 /* ESP chip limits other variants by 16-bits of transfer in esp_dma_length_limit()
630 static void esp_map_sense(struct esp *esp, struct esp_cmd_entry *ent) in esp_map_sense() argument
633 if (esp->flags & ESP_FLAG_NO_DMA_MAP) { in esp_map_sense()
638 ent->sense_dma = dma_map_single(esp->dev, ent->sense_ptr, in esp_map_sense()
642 static void esp_unmap_sense(struct esp *esp, struct esp_cmd_entry *ent) in esp_unmap_sense() argument
644 if (!(esp->flags & ESP_FLAG_NO_DMA_MAP)) in esp_unmap_sense()
645 dma_unmap_single(esp->dev, ent->sense_dma, in esp_unmap_sense()
657 static void esp_autosense(struct esp *esp, struct esp_cmd_entry *ent) in esp_autosense() argument
671 esp_map_sense(esp, ent); in esp_autosense()
675 esp->active_cmd = ent; in esp_autosense()
677 p = esp->command_block; in esp_autosense()
678 esp->msg_out_len = 0; in esp_autosense()
689 esp->select_state = ESP_SELECT_BASIC; in esp_autosense()
692 if (esp->rev == FASHME) in esp_autosense()
696 esp_write_tgt_sync(esp, tgt); in esp_autosense()
697 esp_write_tgt_config3(esp, tgt); in esp_autosense()
699 val = (p - esp->command_block); in esp_autosense()
701 esp_send_dma_cmd(esp, val, 16, ESP_CMD_SELA); in esp_autosense()
704 static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp) in find_and_prep_issuable_command() argument
708 list_for_each_entry(ent, &esp->queued_cmds, list) { in find_and_prep_issuable_command()
735 static void esp_maybe_execute_command(struct esp *esp) in esp_maybe_execute_command() argument
746 if (esp->active_cmd || in esp_maybe_execute_command()
747 (esp->flags & ESP_FLAG_RESETTING)) in esp_maybe_execute_command()
750 ent = find_and_prep_issuable_command(esp); in esp_maybe_execute_command()
755 esp_autosense(esp, ent); in esp_maybe_execute_command()
763 tp = &esp->target[tgt]; in esp_maybe_execute_command()
765 list_move(&ent->list, &esp->active_cmds); in esp_maybe_execute_command()
767 esp->active_cmd = ent; in esp_maybe_execute_command()
769 esp_map_dma(esp, cmd); in esp_maybe_execute_command()
770 esp_save_pointers(esp, ent); in esp_maybe_execute_command()
775 p = esp->command_block; in esp_maybe_execute_command()
777 esp->msg_out_len = 0; in esp_maybe_execute_command()
798 if (esp->rev == FASHME && esp_need_to_nego_wide(tp)) { in esp_maybe_execute_command()
799 esp->msg_out_len = in esp_maybe_execute_command()
800 spi_populate_width_msg(&esp->msg_out[0], in esp_maybe_execute_command()
805 esp->msg_out_len = in esp_maybe_execute_command()
806 spi_populate_sync_msg(&esp->msg_out[0], in esp_maybe_execute_command()
815 if (esp->msg_out_len) in esp_maybe_execute_command()
822 if (ent->tag[0] && esp->rev == ESP100) { in esp_maybe_execute_command()
830 esp->cmd_bytes_left = cmd->cmd_len; in esp_maybe_execute_command()
831 esp->cmd_bytes_ptr = &cmd->cmnd[0]; in esp_maybe_execute_command()
834 for (i = esp->msg_out_len - 1; in esp_maybe_execute_command()
836 esp->msg_out[i + 2] = esp->msg_out[i]; in esp_maybe_execute_command()
837 esp->msg_out[0] = ent->tag[0]; in esp_maybe_execute_command()
838 esp->msg_out[1] = ent->tag[1]; in esp_maybe_execute_command()
839 esp->msg_out_len += 2; in esp_maybe_execute_command()
843 esp->select_state = ESP_SELECT_MSGOUT; in esp_maybe_execute_command()
856 esp->select_state = ESP_SELECT_BASIC; in esp_maybe_execute_command()
859 if (esp->rev == FASHME) in esp_maybe_execute_command()
863 esp_write_tgt_sync(esp, tgt); in esp_maybe_execute_command()
864 esp_write_tgt_config3(esp, tgt); in esp_maybe_execute_command()
866 val = (p - esp->command_block); in esp_maybe_execute_command()
869 printk("ESP: tgt[%d] lun[%d] scsi_cmd [ ", tgt, lun); in esp_maybe_execute_command()
875 esp_send_dma_cmd(esp, val, 16, start_cmd); in esp_maybe_execute_command()
878 static struct esp_cmd_entry *esp_get_ent(struct esp *esp) in esp_get_ent() argument
880 struct list_head *head = &esp->esp_cmd_pool; in esp_get_ent()
893 static void esp_put_ent(struct esp *esp, struct esp_cmd_entry *ent) in esp_put_ent() argument
895 list_add(&ent->list, &esp->esp_cmd_pool); in esp_put_ent()
898 static void esp_cmd_is_done(struct esp *esp, struct esp_cmd_entry *ent, in esp_cmd_is_done() argument
905 esp->active_cmd = NULL; in esp_cmd_is_done()
906 esp_unmap_dma(esp, cmd); in esp_cmd_is_done()
919 esp_unmap_sense(esp, ent); in esp_cmd_is_done()
931 printk("esp%d: tgt[%d] lun[%d] AUTO SENSE[ ", in esp_cmd_is_done()
932 esp->host->unique_id, tgt, lun); in esp_cmd_is_done()
942 esp_put_ent(esp, ent); in esp_cmd_is_done()
944 esp_maybe_execute_command(esp); in esp_cmd_is_done()
947 static void esp_event_queue_full(struct esp *esp, struct esp_cmd_entry *ent) in esp_event_queue_full() argument
958 struct esp *esp = shost_priv(dev->host); in esp_queuecommand_lck() local
962 ent = esp_get_ent(esp); in esp_queuecommand_lck()
971 list_add_tail(&ent->list, &esp->queued_cmds); in esp_queuecommand_lck()
973 esp_maybe_execute_command(esp); in esp_queuecommand_lck()
980 static int esp_check_gross_error(struct esp *esp) in DEF_SCSI_QCMD()
982 if (esp->sreg & ESP_STAT_SPAM) { in DEF_SCSI_QCMD()
989 shost_printk(KERN_ERR, esp->host, in DEF_SCSI_QCMD()
990 "Gross error sreg[%02x]\n", esp->sreg); in DEF_SCSI_QCMD()
997 static int esp_check_spur_intr(struct esp *esp) in esp_check_spur_intr() argument
999 switch (esp->rev) { in esp_check_spur_intr()
1005 esp->sreg &= ~ESP_STAT_INTR; in esp_check_spur_intr()
1009 if (!(esp->sreg & ESP_STAT_INTR)) { in esp_check_spur_intr()
1010 if (esp->ireg & ESP_INTR_SR) in esp_check_spur_intr()
1014 * ESP is not, the only possibility is a DMA error. in esp_check_spur_intr()
1016 if (!esp->ops->dma_error(esp)) { in esp_check_spur_intr()
1017 shost_printk(KERN_ERR, esp->host, in esp_check_spur_intr()
1019 esp->sreg); in esp_check_spur_intr()
1023 shost_printk(KERN_ERR, esp->host, "DMA error\n"); in esp_check_spur_intr()
1034 static void esp_schedule_reset(struct esp *esp) in esp_schedule_reset() argument
1038 esp->flags |= ESP_FLAG_RESETTING; in esp_schedule_reset()
1039 esp_event(esp, ESP_EVENT_RESET); in esp_schedule_reset()
1046 static struct esp_cmd_entry *esp_reconnect_with_tag(struct esp *esp, in esp_reconnect_with_tag() argument
1053 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1061 if (esp->ops->irq_pending(esp)) in esp_reconnect_with_tag()
1065 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1070 esp->sreg = esp_read8(ESP_STATUS); in esp_reconnect_with_tag()
1071 esp->ireg = esp_read8(ESP_INTRPT); in esp_reconnect_with_tag()
1074 i, esp->ireg, esp->sreg); in esp_reconnect_with_tag()
1076 if (esp->ireg & ESP_INTR_DC) { in esp_reconnect_with_tag()
1077 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1082 if ((esp->sreg & ESP_STAT_PMASK) != ESP_MIP) { in esp_reconnect_with_tag()
1083 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1084 "Reconnect, not MIP sreg[%02x].\n", esp->sreg); in esp_reconnect_with_tag()
1089 esp->command_block[0] = 0xff; in esp_reconnect_with_tag()
1090 esp->command_block[1] = 0xff; in esp_reconnect_with_tag()
1091 esp->ops->send_dma_cmd(esp, esp->command_block_dma, in esp_reconnect_with_tag()
1095 scsi_esp_cmd(esp, ESP_CMD_MOK); in esp_reconnect_with_tag()
1098 if (esp->ops->irq_pending(esp)) { in esp_reconnect_with_tag()
1099 esp->sreg = esp_read8(ESP_STATUS); in esp_reconnect_with_tag()
1100 esp->ireg = esp_read8(ESP_INTRPT); in esp_reconnect_with_tag()
1101 if (esp->ireg & ESP_INTR_FDONE) in esp_reconnect_with_tag()
1107 shost_printk(KERN_ERR, esp->host, "Reconnect IRQ2 timeout\n"); in esp_reconnect_with_tag()
1110 esp->ops->dma_drain(esp); in esp_reconnect_with_tag()
1111 esp->ops->dma_invalidate(esp); in esp_reconnect_with_tag()
1114 i, esp->ireg, esp->sreg, in esp_reconnect_with_tag()
1115 esp->command_block[0], in esp_reconnect_with_tag()
1116 esp->command_block[1]); in esp_reconnect_with_tag()
1118 if (esp->command_block[0] < SIMPLE_QUEUE_TAG || in esp_reconnect_with_tag()
1119 esp->command_block[0] > ORDERED_QUEUE_TAG) { in esp_reconnect_with_tag()
1120 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1122 esp->command_block[0]); in esp_reconnect_with_tag()
1126 ent = lp->tagged_cmds[esp->command_block[1]]; in esp_reconnect_with_tag()
1128 shost_printk(KERN_ERR, esp->host, in esp_reconnect_with_tag()
1130 esp->command_block[1]); in esp_reconnect_with_tag()
1137 static int esp_reconnect(struct esp *esp) in esp_reconnect() argument
1145 BUG_ON(esp->active_cmd); in esp_reconnect()
1146 if (esp->rev == FASHME) { in esp_reconnect()
1150 target = esp->fifo[0]; in esp_reconnect()
1151 lun = esp->fifo[1] & 0x7; in esp_reconnect()
1158 * see the ID of the ESP and the one reconnecting target in esp_reconnect()
1161 if (!(bits & esp->scsi_id_mask)) in esp_reconnect()
1163 bits &= ~esp->scsi_id_mask; in esp_reconnect()
1170 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_reconnect()
1171 if (esp->rev == ESP100) { in esp_reconnect()
1181 scsi_esp_cmd(esp, ESP_CMD_NULL); in esp_reconnect()
1184 esp_write_tgt_sync(esp, target); in esp_reconnect()
1185 esp_write_tgt_config3(esp, target); in esp_reconnect()
1187 scsi_esp_cmd(esp, ESP_CMD_MOK); in esp_reconnect()
1189 if (esp->rev == FASHME) in esp_reconnect()
1193 tp = &esp->target[target]; in esp_reconnect()
1196 shost_printk(KERN_ERR, esp->host, in esp_reconnect()
1205 ent = esp_reconnect_with_tag(esp, lp); in esp_reconnect()
1210 esp->active_cmd = ent; in esp_reconnect()
1212 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_reconnect()
1213 esp_restore_pointers(esp, ent); in esp_reconnect()
1214 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_reconnect()
1218 esp_schedule_reset(esp); in esp_reconnect()
1222 static int esp_finish_select(struct esp *esp) in esp_finish_select() argument
1228 esp->select_state = ESP_SELECT_NONE; in esp_finish_select()
1230 esp->seqreg = esp_read8(ESP_SSTEP) & ESP_STEP_VBITS; in esp_finish_select()
1231 ent = esp->active_cmd; in esp_finish_select()
1234 if (esp->ops->dma_error(esp)) { in esp_finish_select()
1238 esp_schedule_reset(esp); in esp_finish_select()
1239 esp_cmd_is_done(esp, ent, cmd, DID_ERROR); in esp_finish_select()
1243 esp->ops->dma_invalidate(esp); in esp_finish_select()
1245 if (esp->ireg == (ESP_INTR_RSEL | ESP_INTR_FDONE)) { in esp_finish_select()
1246 struct esp_target_data *tp = &esp->target[cmd->device->id]; in esp_finish_select()
1253 esp_unmap_dma(esp, cmd); in esp_finish_select()
1256 esp->cmd_bytes_ptr = NULL; in esp_finish_select()
1257 esp->cmd_bytes_left = 0; in esp_finish_select()
1259 esp_unmap_sense(esp, ent); in esp_finish_select()
1265 list_move(&ent->list, &esp->queued_cmds); in esp_finish_select()
1266 esp->active_cmd = NULL; in esp_finish_select()
1274 if (esp->ireg == ESP_INTR_DC) { in esp_finish_select()
1281 esp->target[dev->id].flags |= ESP_TGT_CHECK_NEGO; in esp_finish_select()
1283 scsi_esp_cmd(esp, ESP_CMD_ESEL); in esp_finish_select()
1284 esp_cmd_is_done(esp, ent, cmd, DID_BAD_TARGET); in esp_finish_select()
1288 if (esp->ireg == (ESP_INTR_FDONE | ESP_INTR_BSERV)) { in esp_finish_select()
1292 if (esp->rev <= ESP236) { in esp_finish_select()
1295 scsi_esp_cmd(esp, ESP_CMD_NULL); in esp_finish_select()
1298 (!esp->prev_soff || in esp_finish_select()
1299 ((esp->sreg & ESP_STAT_PMASK) != ESP_DIP))) in esp_finish_select()
1300 esp_flush_fifo(esp); in esp_finish_select()
1306 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_finish_select()
1310 shost_printk(KERN_INFO, esp->host, in esp_finish_select()
1311 "Unexpected selection completion ireg[%x]\n", esp->ireg); in esp_finish_select()
1312 esp_schedule_reset(esp); in esp_finish_select()
1316 static int esp_data_bytes_sent(struct esp *esp, struct esp_cmd_entry *ent, in esp_data_bytes_sent() argument
1322 if (esp->prev_cfg3 & ESP_CONFIG3_EWIDE) in esp_data_bytes_sent()
1326 if (!(esp->sreg & ESP_STAT_TCNT)) { in esp_data_bytes_sent()
1329 if (esp->rev == FASHME) in esp_data_bytes_sent()
1331 if (esp->rev == PCSCSI && (esp->config2 & ESP_CONFIG2_FENAB)) in esp_data_bytes_sent()
1335 bytes_sent = esp->data_dma_len; in esp_data_bytes_sent()
1337 bytes_sent -= esp->send_cmd_residual; in esp_data_bytes_sent()
1372 if (!esp->prev_soff) { in esp_data_bytes_sent()
1376 if (esp->rev == ESP100) { in esp_data_bytes_sent()
1390 esp->sreg = esp_read8(ESP_STATUS); in esp_data_bytes_sent()
1391 phase = esp->sreg & ESP_STAT_PMASK; in esp_data_bytes_sent()
1405 esp_flush_fifo(esp); in esp_data_bytes_sent()
1410 static void esp_setsync(struct esp *esp, struct esp_target_data *tp, in esp_setsync() argument
1420 esp_soff |= esp->radelay; in esp_setsync()
1421 if (esp->rev >= FAS236) { in esp_setsync()
1423 if (esp->rev >= FAS100A) in esp_setsync()
1427 if (esp->rev == FASHME) in esp_setsync()
1428 esp_soff &= ~esp->radelay; in esp_setsync()
1433 esp->prev_cfg3 = tp->esp_config3; in esp_setsync()
1434 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_setsync()
1438 tp->esp_period = esp->prev_stp = esp_stp; in esp_setsync()
1439 tp->esp_offset = esp->prev_soff = esp_soff; in esp_setsync()
1449 static void esp_msgin_reject(struct esp *esp) in esp_msgin_reject() argument
1451 struct esp_cmd_entry *ent = esp->active_cmd; in esp_msgin_reject()
1457 tp = &esp->target[tgt]; in esp_msgin_reject()
1464 scsi_esp_cmd(esp, ESP_CMD_RATN); in esp_msgin_reject()
1466 esp->msg_out_len = in esp_msgin_reject()
1467 spi_populate_sync_msg(&esp->msg_out[0], in esp_msgin_reject()
1471 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_reject()
1480 esp_setsync(esp, tp, 0, 0, 0, 0); in esp_msgin_reject()
1481 scsi_esp_cmd(esp, ESP_CMD_RATN); in esp_msgin_reject()
1485 shost_printk(KERN_INFO, esp->host, "Unexpected MESSAGE REJECT\n"); in esp_msgin_reject()
1486 esp_schedule_reset(esp); in esp_msgin_reject()
1489 static void esp_msgin_sdtr(struct esp *esp, struct esp_target_data *tp) in esp_msgin_sdtr() argument
1491 u8 period = esp->msg_in[3]; in esp_msgin_sdtr()
1492 u8 offset = esp->msg_in[4]; in esp_msgin_sdtr()
1504 if (period > esp->max_period) { in esp_msgin_sdtr()
1508 if (period < esp->min_period) in esp_msgin_sdtr()
1511 one_clock = esp->ccycle / 1000; in esp_msgin_sdtr()
1513 if (stp && esp->rev >= FAS236) { in esp_msgin_sdtr()
1521 esp_setsync(esp, tp, period, offset, stp, offset); in esp_msgin_sdtr()
1525 esp->msg_out[0] = MESSAGE_REJECT; in esp_msgin_sdtr()
1526 esp->msg_out_len = 1; in esp_msgin_sdtr()
1527 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_sdtr()
1533 esp->msg_out_len = in esp_msgin_sdtr()
1534 spi_populate_sync_msg(&esp->msg_out[0], in esp_msgin_sdtr()
1537 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_sdtr()
1540 static void esp_msgin_wdtr(struct esp *esp, struct esp_target_data *tp) in esp_msgin_wdtr() argument
1542 int size = 8 << esp->msg_in[3]; in esp_msgin_wdtr()
1545 if (esp->rev != FASHME) in esp_msgin_wdtr()
1563 esp->prev_cfg3 = cfg3; in esp_msgin_wdtr()
1572 scsi_esp_cmd(esp, ESP_CMD_RATN); in esp_msgin_wdtr()
1574 esp->msg_out_len = in esp_msgin_wdtr()
1575 spi_populate_sync_msg(&esp->msg_out[0], in esp_msgin_wdtr()
1579 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_wdtr()
1584 esp->msg_out[0] = MESSAGE_REJECT; in esp_msgin_wdtr()
1585 esp->msg_out_len = 1; in esp_msgin_wdtr()
1586 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_wdtr()
1589 static void esp_msgin_extended(struct esp *esp) in esp_msgin_extended() argument
1591 struct esp_cmd_entry *ent = esp->active_cmd; in esp_msgin_extended()
1596 tp = &esp->target[tgt]; in esp_msgin_extended()
1597 if (esp->msg_in[2] == EXTENDED_SDTR) { in esp_msgin_extended()
1598 esp_msgin_sdtr(esp, tp); in esp_msgin_extended()
1601 if (esp->msg_in[2] == EXTENDED_WDTR) { in esp_msgin_extended()
1602 esp_msgin_wdtr(esp, tp); in esp_msgin_extended()
1606 shost_printk(KERN_INFO, esp->host, in esp_msgin_extended()
1607 "Unexpected extended msg type %x\n", esp->msg_in[2]); in esp_msgin_extended()
1609 esp->msg_out[0] = MESSAGE_REJECT; in esp_msgin_extended()
1610 esp->msg_out_len = 1; in esp_msgin_extended()
1611 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_extended()
1617 static int esp_msgin_process(struct esp *esp) in esp_msgin_process() argument
1619 u8 msg0 = esp->msg_in[0]; in esp_msgin_process()
1620 int len = esp->msg_in_len; in esp_msgin_process()
1624 shost_printk(KERN_INFO, esp->host, in esp_msgin_process()
1633 if (len < esp->msg_in[1] + 2) in esp_msgin_process()
1635 esp_msgin_extended(esp); in esp_msgin_process()
1644 if (esp->msg_in[1] != 1) in esp_msgin_process()
1647 ent = esp->active_cmd; in esp_msgin_process()
1661 esp_restore_pointers(esp, esp->active_cmd); in esp_msgin_process()
1664 esp_save_pointers(esp, esp->active_cmd); in esp_msgin_process()
1669 struct esp_cmd_entry *ent = esp->active_cmd; in esp_msgin_process()
1672 esp_event(esp, ESP_EVENT_FREE_BUS); in esp_msgin_process()
1673 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_msgin_process()
1677 esp_msgin_reject(esp); in esp_msgin_process()
1682 esp->msg_out[0] = MESSAGE_REJECT; in esp_msgin_process()
1683 esp->msg_out_len = 1; in esp_msgin_process()
1684 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_msgin_process()
1689 static int esp_process_event(struct esp *esp) in esp_process_event() argument
1696 esp->event, esp->sreg & ESP_STAT_PMASK); in esp_process_event()
1697 switch (esp->event) { in esp_process_event()
1699 switch (esp->sreg & ESP_STAT_PMASK) { in esp_process_event()
1701 esp_event(esp, ESP_EVENT_DATA_OUT); in esp_process_event()
1704 esp_event(esp, ESP_EVENT_DATA_IN); in esp_process_event()
1707 esp_flush_fifo(esp); in esp_process_event()
1708 scsi_esp_cmd(esp, ESP_CMD_ICCSEQ); in esp_process_event()
1709 esp_event(esp, ESP_EVENT_STATUS); in esp_process_event()
1710 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_process_event()
1714 esp_event(esp, ESP_EVENT_MSGOUT); in esp_process_event()
1718 esp_event(esp, ESP_EVENT_MSGIN); in esp_process_event()
1722 esp_event(esp, ESP_EVENT_CMD_START); in esp_process_event()
1726 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1728 esp->sreg); in esp_process_event()
1729 esp_schedule_reset(esp); in esp_process_event()
1739 struct esp_cmd_entry *ent = esp->active_cmd; in esp_process_event()
1744 if (esp->rev == ESP100) in esp_process_event()
1745 scsi_esp_cmd(esp, ESP_CMD_NULL); in esp_process_event()
1752 if (esp->ops->dma_length_limit) in esp_process_event()
1753 dma_len = esp->ops->dma_length_limit(esp, dma_addr, in esp_process_event()
1756 dma_len = esp_dma_length_limit(esp, dma_addr, dma_len); in esp_process_event()
1758 esp->data_dma_len = dma_len; in esp_process_event()
1761 shost_printk(KERN_ERR, esp->host, in esp_process_event()
1763 shost_printk(KERN_ERR, esp->host, in esp_process_event()
1767 esp_schedule_reset(esp); in esp_process_event()
1774 esp->ops->send_dma_cmd(esp, dma_addr, dma_len, dma_len, in esp_process_event()
1776 esp_event(esp, ESP_EVENT_DATA_DONE); in esp_process_event()
1780 struct esp_cmd_entry *ent = esp->active_cmd; in esp_process_event()
1784 if (esp->ops->dma_error(esp)) { in esp_process_event()
1785 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1787 esp_schedule_reset(esp); in esp_process_event()
1794 esp->ops->dma_drain(esp); in esp_process_event()
1796 esp->ops->dma_invalidate(esp); in esp_process_event()
1798 if (esp->ireg != ESP_INTR_BSERV) { in esp_process_event()
1802 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1804 esp_schedule_reset(esp); in esp_process_event()
1808 bytes_sent = esp_data_bytes_sent(esp, ent, cmd); in esp_process_event()
1815 esp_schedule_reset(esp); in esp_process_event()
1819 esp_advance_dma(esp, ent, cmd, bytes_sent); in esp_process_event()
1820 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_process_event()
1825 struct esp_cmd_entry *ent = esp->active_cmd; in esp_process_event()
1827 if (esp->ireg & ESP_INTR_FDONE) { in esp_process_event()
1830 scsi_esp_cmd(esp, ESP_CMD_MOK); in esp_process_event()
1831 } else if (esp->ireg == ESP_INTR_BSERV) { in esp_process_event()
1834 esp_event(esp, ESP_EVENT_MSGIN); in esp_process_event()
1839 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1842 esp_schedule_reset(esp); in esp_process_event()
1846 esp_event(esp, ESP_EVENT_FREE_BUS); in esp_process_event()
1847 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_process_event()
1851 struct esp_cmd_entry *ent = esp->active_cmd; in esp_process_event()
1856 scsi_esp_cmd(esp, ESP_CMD_ESEL); in esp_process_event()
1862 esp_event_queue_full(esp, ent); in esp_process_event()
1867 esp_autosense(esp, ent); in esp_process_event()
1869 esp_cmd_is_done(esp, ent, cmd, DID_OK); in esp_process_event()
1876 esp->active_cmd = NULL; in esp_process_event()
1877 esp_maybe_execute_command(esp); in esp_process_event()
1879 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1882 esp_schedule_reset(esp); in esp_process_event()
1885 if (esp->active_cmd) in esp_process_event()
1886 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_process_event()
1890 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_process_event()
1894 printk("ESP: Sending message [ "); in esp_process_event()
1895 for (i = 0; i < esp->msg_out_len; i++) in esp_process_event()
1896 printk("%02x ", esp->msg_out[i]); in esp_process_event()
1900 if (esp->rev == FASHME) { in esp_process_event()
1904 for (i = 0; i < esp->msg_out_len; i++) { in esp_process_event()
1905 esp_write8(esp->msg_out[i], ESP_FDATA); in esp_process_event()
1908 scsi_esp_cmd(esp, ESP_CMD_TI); in esp_process_event()
1910 if (esp->msg_out_len == 1) { in esp_process_event()
1911 esp_write8(esp->msg_out[0], ESP_FDATA); in esp_process_event()
1912 scsi_esp_cmd(esp, ESP_CMD_TI); in esp_process_event()
1913 } else if (esp->flags & ESP_FLAG_USE_FIFO) { in esp_process_event()
1914 for (i = 0; i < esp->msg_out_len; i++) in esp_process_event()
1915 esp_write8(esp->msg_out[i], ESP_FDATA); in esp_process_event()
1916 scsi_esp_cmd(esp, ESP_CMD_TI); in esp_process_event()
1919 memcpy(esp->command_block, in esp_process_event()
1920 esp->msg_out, in esp_process_event()
1921 esp->msg_out_len); in esp_process_event()
1923 esp->ops->send_dma_cmd(esp, in esp_process_event()
1924 esp->command_block_dma, in esp_process_event()
1925 esp->msg_out_len, in esp_process_event()
1926 esp->msg_out_len, in esp_process_event()
1931 esp_event(esp, ESP_EVENT_MSGOUT_DONE); in esp_process_event()
1935 if (esp->rev == FASHME) { in esp_process_event()
1936 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_process_event()
1938 if (esp->msg_out_len > 1) in esp_process_event()
1939 esp->ops->dma_invalidate(esp); in esp_process_event()
1944 if (!(esp->ireg & ESP_INTR_DC)) in esp_process_event()
1945 scsi_esp_cmd(esp, ESP_CMD_NULL); in esp_process_event()
1948 esp->msg_out_len = 0; in esp_process_event()
1950 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_process_event()
1953 if (esp->ireg & ESP_INTR_BSERV) { in esp_process_event()
1954 if (esp->rev == FASHME) { in esp_process_event()
1957 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_process_event()
1959 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_process_event()
1960 if (esp->rev == ESP100) in esp_process_event()
1961 scsi_esp_cmd(esp, ESP_CMD_NULL); in esp_process_event()
1963 scsi_esp_cmd(esp, ESP_CMD_TI); in esp_process_event()
1964 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_process_event()
1967 if (esp->ireg & ESP_INTR_FDONE) { in esp_process_event()
1970 if (esp->rev == FASHME) in esp_process_event()
1971 val = esp->fifo[0]; in esp_process_event()
1974 esp->msg_in[esp->msg_in_len++] = val; in esp_process_event()
1978 if (!esp_msgin_process(esp)) in esp_process_event()
1979 esp->msg_in_len = 0; in esp_process_event()
1981 if (esp->rev == FASHME) in esp_process_event()
1982 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_process_event()
1984 scsi_esp_cmd(esp, ESP_CMD_MOK); in esp_process_event()
1987 if (esp->event == ESP_EVENT_RESET) in esp_process_event()
1990 if (esp->event != ESP_EVENT_FREE_BUS) in esp_process_event()
1991 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_process_event()
1993 shost_printk(KERN_INFO, esp->host, in esp_process_event()
1995 esp_schedule_reset(esp); in esp_process_event()
2000 memcpy(esp->command_block, esp->cmd_bytes_ptr, in esp_process_event()
2001 esp->cmd_bytes_left); in esp_process_event()
2002 esp_send_dma_cmd(esp, esp->cmd_bytes_left, 16, ESP_CMD_TI); in esp_process_event()
2003 esp_event(esp, ESP_EVENT_CMD_DONE); in esp_process_event()
2004 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK; in esp_process_event()
2007 esp->ops->dma_invalidate(esp); in esp_process_event()
2008 if (esp->ireg & ESP_INTR_BSERV) { in esp_process_event()
2009 esp_event(esp, ESP_EVENT_CHECK_PHASE); in esp_process_event()
2012 esp_schedule_reset(esp); in esp_process_event()
2016 scsi_esp_cmd(esp, ESP_CMD_RS); in esp_process_event()
2020 shost_printk(KERN_INFO, esp->host, in esp_process_event()
2021 "Unexpected event %x, resetting\n", esp->event); in esp_process_event()
2022 esp_schedule_reset(esp); in esp_process_event()
2028 static void esp_reset_cleanup_one(struct esp *esp, struct esp_cmd_entry *ent) in esp_reset_cleanup_one() argument
2032 esp_unmap_dma(esp, cmd); in esp_reset_cleanup_one()
2037 esp_unmap_sense(esp, ent); in esp_reset_cleanup_one()
2041 esp_put_ent(esp, ent); in esp_reset_cleanup_one()
2052 static void esp_reset_cleanup(struct esp *esp) in esp_reset_cleanup() argument
2057 list_for_each_entry_safe(ent, tmp, &esp->queued_cmds, list) { in esp_reset_cleanup()
2063 esp_put_ent(esp, ent); in esp_reset_cleanup()
2066 list_for_each_entry_safe(ent, tmp, &esp->active_cmds, list) { in esp_reset_cleanup()
2067 if (ent == esp->active_cmd) in esp_reset_cleanup()
2068 esp->active_cmd = NULL; in esp_reset_cleanup()
2069 esp_reset_cleanup_one(esp, ent); in esp_reset_cleanup()
2072 BUG_ON(esp->active_cmd != NULL); in esp_reset_cleanup()
2076 struct esp_target_data *tp = &esp->target[i]; in esp_reset_cleanup()
2090 esp->flags &= ~ESP_FLAG_RESETTING; in esp_reset_cleanup()
2094 static void __esp_interrupt(struct esp *esp) in __esp_interrupt() argument
2102 esp->sreg = esp_read8(ESP_STATUS); in __esp_interrupt()
2103 esp->seqreg = esp_read8(ESP_SSTEP); in __esp_interrupt()
2104 esp->ireg = esp_read8(ESP_INTRPT); in __esp_interrupt()
2106 if (esp->flags & ESP_FLAG_RESETTING) { in __esp_interrupt()
2109 if (esp_check_gross_error(esp)) in __esp_interrupt()
2112 finish_reset = esp_check_spur_intr(esp); in __esp_interrupt()
2117 if (esp->ireg & ESP_INTR_SR) in __esp_interrupt()
2121 esp_reset_cleanup(esp); in __esp_interrupt()
2122 if (esp->eh_reset) { in __esp_interrupt()
2123 complete(esp->eh_reset); in __esp_interrupt()
2124 esp->eh_reset = NULL; in __esp_interrupt()
2129 phase = (esp->sreg & ESP_STAT_PMASK); in __esp_interrupt()
2130 if (esp->rev == FASHME) { in __esp_interrupt()
2132 esp->select_state == ESP_SELECT_NONE && in __esp_interrupt()
2133 esp->event != ESP_EVENT_STATUS && in __esp_interrupt()
2134 esp->event != ESP_EVENT_DATA_DONE) || in __esp_interrupt()
2135 (esp->ireg & ESP_INTR_RSEL)) { in __esp_interrupt()
2136 esp->sreg2 = esp_read8(ESP_STATUS2); in __esp_interrupt()
2137 if (!(esp->sreg2 & ESP_STAT2_FEMPTY) || in __esp_interrupt()
2138 (esp->sreg2 & ESP_STAT2_F1BYTE)) in __esp_interrupt()
2139 hme_read_fifo(esp); in __esp_interrupt()
2145 esp->sreg, esp->seqreg, esp->sreg2, esp->ireg); in __esp_interrupt()
2149 if (esp->ireg & (ESP_INTR_S | ESP_INTR_SATN | ESP_INTR_IC)) { in __esp_interrupt()
2150 shost_printk(KERN_INFO, esp->host, in __esp_interrupt()
2151 "unexpected IREG %02x\n", esp->ireg); in __esp_interrupt()
2152 if (esp->ireg & ESP_INTR_IC) in __esp_interrupt()
2153 esp_dump_cmd_log(esp); in __esp_interrupt()
2155 esp_schedule_reset(esp); in __esp_interrupt()
2157 if (esp->ireg & ESP_INTR_RSEL) { in __esp_interrupt()
2158 if (esp->active_cmd) in __esp_interrupt()
2159 (void) esp_finish_select(esp); in __esp_interrupt()
2160 intr_done = esp_reconnect(esp); in __esp_interrupt()
2163 if (esp->select_state != ESP_SELECT_NONE) in __esp_interrupt()
2164 intr_done = esp_finish_select(esp); in __esp_interrupt()
2168 intr_done = esp_process_event(esp); in __esp_interrupt()
2173 struct esp *esp = dev_id; in scsi_esp_intr() local
2177 spin_lock_irqsave(esp->host->host_lock, flags); in scsi_esp_intr()
2179 if (esp->ops->irq_pending(esp)) { in scsi_esp_intr()
2184 __esp_interrupt(esp); in scsi_esp_intr()
2185 if (!(esp->flags & ESP_FLAG_QUICKIRQ_CHECK)) in scsi_esp_intr()
2187 esp->flags &= ~ESP_FLAG_QUICKIRQ_CHECK; in scsi_esp_intr()
2190 if (esp->ops->irq_pending(esp)) in scsi_esp_intr()
2197 spin_unlock_irqrestore(esp->host->host_lock, flags); in scsi_esp_intr()
2203 static void esp_get_revision(struct esp *esp) in esp_get_revision() argument
2207 esp->config1 = (ESP_CONFIG1_PENABLE | (esp->scsi_id & 7)); in esp_get_revision()
2208 if (esp->config2 == 0) { in esp_get_revision()
2209 esp->config2 = (ESP_CONFIG2_SCSI2ENAB | ESP_CONFIG2_REGPARITY); in esp_get_revision()
2210 esp_write8(esp->config2, ESP_CFG2); in esp_get_revision()
2215 esp->config2 = 0; in esp_get_revision()
2222 esp->rev = ESP100; in esp_get_revision()
2227 esp_set_all_config3(esp, 5); in esp_get_revision()
2228 esp->prev_cfg3 = 5; in esp_get_revision()
2229 esp_write8(esp->config2, ESP_CFG2); in esp_get_revision()
2231 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_get_revision()
2238 esp->rev = ESP100A; in esp_get_revision()
2240 esp_set_all_config3(esp, 0); in esp_get_revision()
2241 esp->prev_cfg3 = 0; in esp_get_revision()
2242 esp_write8(esp->prev_cfg3, ESP_CFG3); in esp_get_revision()
2247 if (esp->cfact == 0 || esp->cfact > ESP_CCF_F5) { in esp_get_revision()
2248 esp->rev = FAST; in esp_get_revision()
2249 esp->sync_defp = SYNC_DEFP_FAST; in esp_get_revision()
2251 esp->rev = ESP236; in esp_get_revision()
2256 static void esp_init_swstate(struct esp *esp) in esp_init_swstate() argument
2260 INIT_LIST_HEAD(&esp->queued_cmds); in esp_init_swstate()
2261 INIT_LIST_HEAD(&esp->active_cmds); in esp_init_swstate()
2262 INIT_LIST_HEAD(&esp->esp_cmd_pool); in esp_init_swstate()
2269 esp->target[i].flags = 0; in esp_init_swstate()
2270 esp->target[i].nego_goal_period = 0; in esp_init_swstate()
2271 esp->target[i].nego_goal_offset = 0; in esp_init_swstate()
2272 esp->target[i].nego_goal_width = 0; in esp_init_swstate()
2273 esp->target[i].nego_goal_tags = 0; in esp_init_swstate()
2277 /* This places the ESP into a known state at boot time. */
2278 static void esp_bootup_reset(struct esp *esp) in esp_bootup_reset() argument
2283 esp->ops->reset_dma(esp); in esp_bootup_reset()
2285 /* Reset the ESP */ in esp_bootup_reset()
2286 esp_reset_esp(esp); in esp_bootup_reset()
2288 /* Reset the SCSI bus, but tell ESP not to generate an irq */ in esp_bootup_reset()
2293 scsi_esp_cmd(esp, ESP_CMD_RS); in esp_bootup_reset()
2296 esp_write8(esp->config1, ESP_CFG1); in esp_bootup_reset()
2302 static void esp_set_clock_params(struct esp *esp) in esp_set_clock_params() argument
2314 * going into the ESP on this machine. Any operation whose timing in esp_set_clock_params()
2321 * The ESP isn't very bright and will arbitrate for the bus and try in esp_set_clock_params()
2323 * ESP when it has taken too long to negotiate and that it should in esp_set_clock_params()
2337 * handle on this ESP. in esp_set_clock_params()
2339 fhz = esp->cfreq; in esp_set_clock_params()
2355 esp->cfact = (ccf == 8 ? 0 : ccf); in esp_set_clock_params()
2356 esp->cfreq = fhz; in esp_set_clock_params()
2357 esp->ccycle = ESP_HZ_TO_CYCLE(fhz); in esp_set_clock_params()
2358 esp->ctick = ESP_TICK(ccf, esp->ccycle); in esp_set_clock_params()
2359 esp->neg_defp = ESP_NEG_DEFP(fhz, ccf); in esp_set_clock_params()
2360 esp->sync_defp = SYNC_DEFP_SLOW; in esp_set_clock_params()
2377 int scsi_esp_register(struct esp *esp) in scsi_esp_register() argument
2382 if (!esp->num_tags) in scsi_esp_register()
2383 esp->num_tags = ESP_DEFAULT_TAGS; in scsi_esp_register()
2384 esp->host->transportt = esp_transport_template; in scsi_esp_register()
2385 esp->host->max_lun = ESP_MAX_LUN; in scsi_esp_register()
2386 esp->host->cmd_per_lun = 2; in scsi_esp_register()
2387 esp->host->unique_id = instance; in scsi_esp_register()
2389 esp_set_clock_params(esp); in scsi_esp_register()
2391 esp_get_revision(esp); in scsi_esp_register()
2393 esp_init_swstate(esp); in scsi_esp_register()
2395 esp_bootup_reset(esp); in scsi_esp_register()
2397 dev_printk(KERN_INFO, esp->dev, "esp%u: regs[%1p:%1p] irq[%u]\n", in scsi_esp_register()
2398 esp->host->unique_id, esp->regs, esp->dma_regs, in scsi_esp_register()
2399 esp->host->irq); in scsi_esp_register()
2400 dev_printk(KERN_INFO, esp->dev, in scsi_esp_register()
2401 "esp%u: is a %s, %u MHz (ccf=%u), SCSI ID %u\n", in scsi_esp_register()
2402 esp->host->unique_id, esp_chip_names[esp->rev], in scsi_esp_register()
2403 esp->cfreq / 1000000, esp->cfact, esp->scsi_id); in scsi_esp_register()
2408 err = scsi_add_host(esp->host, esp->dev); in scsi_esp_register()
2414 scsi_scan_host(esp->host); in scsi_esp_register()
2420 void scsi_esp_unregister(struct esp *esp) in scsi_esp_unregister() argument
2422 scsi_remove_host(esp->host); in scsi_esp_unregister()
2428 struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); in esp_target_alloc() local
2429 struct esp_target_data *tp = &esp->target[starget->id]; in esp_target_alloc()
2438 struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); in esp_target_destroy() local
2439 struct esp_target_data *tp = &esp->target[starget->id]; in esp_target_destroy()
2446 struct esp *esp = shost_priv(dev->host); in esp_sdev_init() local
2447 struct esp_target_data *tp = &esp->target[dev->id]; in esp_sdev_init()
2455 spi_min_period(tp->starget) = esp->min_period; in esp_sdev_init()
2458 if (esp->flags & ESP_FLAG_WIDE_CAPABLE) in esp_sdev_init()
2468 struct esp *esp = shost_priv(dev->host); in esp_sdev_configure() local
2469 struct esp_target_data *tp = &esp->target[dev->id]; in esp_sdev_configure()
2472 scsi_change_queue_depth(dev, esp->num_tags); in esp_sdev_configure()
2492 struct esp *esp = shost_priv(cmd->device->host); in esp_eh_abort_handler() local
2500 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_abort_handler()
2501 shost_printk(KERN_ERR, esp->host, "Aborting command [%p:%02x]\n", in esp_eh_abort_handler()
2503 ent = esp->active_cmd; in esp_eh_abort_handler()
2505 shost_printk(KERN_ERR, esp->host, in esp_eh_abort_handler()
2508 list_for_each_entry(ent, &esp->queued_cmds, list) { in esp_eh_abort_handler()
2509 shost_printk(KERN_ERR, esp->host, "Queued command [%p:%02x]\n", in esp_eh_abort_handler()
2512 list_for_each_entry(ent, &esp->active_cmds, list) { in esp_eh_abort_handler()
2513 shost_printk(KERN_ERR, esp->host, " Active command [%p:%02x]\n", in esp_eh_abort_handler()
2516 esp_dump_cmd_log(esp); in esp_eh_abort_handler()
2517 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_abort_handler()
2519 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_abort_handler()
2522 list_for_each_entry(tmp, &esp->queued_cmds, list) { in esp_eh_abort_handler()
2538 esp_put_ent(esp, ent); in esp_eh_abort_handler()
2545 ent = esp->active_cmd; in esp_eh_abort_handler()
2551 if (esp->msg_out_len) in esp_eh_abort_handler()
2557 esp->msg_out[0] = ABORT_TASK_SET; in esp_eh_abort_handler()
2558 esp->msg_out_len = 1; in esp_eh_abort_handler()
2561 scsi_esp_cmd(esp, ESP_CMD_SATN); in esp_eh_abort_handler()
2582 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_abort_handler()
2585 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_abort_handler()
2587 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_abort_handler()
2595 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_abort_handler()
2603 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_abort_handler()
2609 struct esp *esp = shost_priv(cmd->device->host); in esp_eh_bus_reset_handler() local
2615 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_bus_reset_handler()
2617 esp->eh_reset = &eh_reset; in esp_eh_bus_reset_handler()
2624 esp->flags |= ESP_FLAG_RESETTING; in esp_eh_bus_reset_handler()
2625 scsi_esp_cmd(esp, ESP_CMD_RS); in esp_eh_bus_reset_handler()
2627 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_bus_reset_handler()
2632 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_bus_reset_handler()
2633 esp->eh_reset = NULL; in esp_eh_bus_reset_handler()
2634 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_bus_reset_handler()
2645 struct esp *esp = shost_priv(cmd->device->host); in esp_eh_host_reset_handler() local
2648 spin_lock_irqsave(esp->host->host_lock, flags); in esp_eh_host_reset_handler()
2649 esp_bootup_reset(esp); in esp_eh_host_reset_handler()
2650 esp_reset_cleanup(esp); in esp_eh_host_reset_handler()
2651 spin_unlock_irqrestore(esp->host->host_lock, flags); in esp_eh_host_reset_handler()
2660 return "esp"; in esp_info()
2665 .name = "esp",
2687 struct esp *esp = shost_priv(host); in esp_get_signalling() local
2690 if (esp->flags & ESP_FLAG_DIFFERENTIAL) in esp_get_signalling()
2701 struct esp *esp = shost_priv(host); in esp_set_offset() local
2702 struct esp_target_data *tp = &esp->target[target->id]; in esp_set_offset()
2704 if (esp->flags & ESP_FLAG_DISABLE_SYNC) in esp_set_offset()
2714 struct esp *esp = shost_priv(host); in esp_set_period() local
2715 struct esp_target_data *tp = &esp->target[target->id]; in esp_set_period()
2724 struct esp *esp = shost_priv(host); in esp_set_width() local
2725 struct esp_target_data *tp = &esp->target[target->id]; in esp_set_width()
2755 MODULE_DESCRIPTION("ESP SCSI driver core");
2762 "ESP scsi bus reset delay in seconds");
2766 "ESP bitmapped debugging message enable value:\n"
2784 static inline unsigned int esp_wait_for_fifo(struct esp *esp) in esp_wait_for_fifo() argument
2797 shost_printk(KERN_ERR, esp->host, "FIFO is empty. sreg [%02x]\n", in esp_wait_for_fifo()
2802 static inline int esp_wait_for_intr(struct esp *esp) in esp_wait_for_intr() argument
2807 esp->sreg = esp_read8(ESP_STATUS); in esp_wait_for_intr()
2808 if (esp->sreg & ESP_STAT_INTR) in esp_wait_for_intr()
2814 shost_printk(KERN_ERR, esp->host, "IRQ timeout. sreg [%02x]\n", in esp_wait_for_intr()
2815 esp->sreg); in esp_wait_for_intr()
2821 void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count, in esp_send_pio_cmd() argument
2824 u8 phase = esp->sreg & ESP_STAT_PMASK; in esp_send_pio_cmd()
2827 esp->send_cmd_error = 0; in esp_send_pio_cmd()
2833 scsi_esp_cmd(esp, cmd); in esp_send_pio_cmd()
2836 if (!esp_wait_for_fifo(esp)) in esp_send_pio_cmd()
2839 *dst++ = readb(esp->fifo_reg); in esp_send_pio_cmd()
2845 if (esp_wait_for_intr(esp)) { in esp_send_pio_cmd()
2846 esp->send_cmd_error = 1; in esp_send_pio_cmd()
2850 if ((esp->sreg & ESP_STAT_PMASK) != phase) in esp_send_pio_cmd()
2853 esp->ireg = esp_read8(ESP_INTRPT); in esp_send_pio_cmd()
2854 if (esp->ireg & mask) { in esp_send_pio_cmd()
2855 esp->send_cmd_error = 1; in esp_send_pio_cmd()
2868 scsi_esp_cmd(esp, ESP_CMD_FLUSH); in esp_send_pio_cmd()
2872 writesb(esp->fifo_reg, src, n); in esp_send_pio_cmd()
2876 scsi_esp_cmd(esp, cmd); in esp_send_pio_cmd()
2879 if (esp_wait_for_intr(esp)) { in esp_send_pio_cmd()
2880 esp->send_cmd_error = 1; in esp_send_pio_cmd()
2884 if ((esp->sreg & ESP_STAT_PMASK) != phase) in esp_send_pio_cmd()
2887 esp->ireg = esp_read8(ESP_INTRPT); in esp_send_pio_cmd()
2888 if (esp->ireg & ~ESP_INTR_BSERV) { in esp_send_pio_cmd()
2889 esp->send_cmd_error = 1; in esp_send_pio_cmd()
2898 writesb(esp->fifo_reg, src, n); in esp_send_pio_cmd()
2906 esp->send_cmd_residual = esp_count; in esp_send_pio_cmd()