blob: 752857dc643796b2bbfdbeec64b44bef28a3eae7 [file] [log] [blame]
David S. Millercd9ad582007-04-26 21:19:23 -07001/* esp_scsi.c: ESP SCSI driver.
2 *
3 * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
4 */
5
6#include <linux/kernel.h>
7#include <linux/types.h>
8#include <linux/slab.h>
9#include <linux/delay.h>
10#include <linux/list.h>
11#include <linux/completion.h>
12#include <linux/kallsyms.h>
13#include <linux/module.h>
14#include <linux/moduleparam.h>
15#include <linux/init.h>
Alexey Dobriyane1f2a092007-04-27 15:19:27 -070016#include <linux/irqreturn.h>
David S. Millercd9ad582007-04-26 21:19:23 -070017
18#include <asm/irq.h>
19#include <asm/io.h>
20#include <asm/dma.h>
21
22#include <scsi/scsi.h>
23#include <scsi/scsi_host.h>
24#include <scsi/scsi_cmnd.h>
25#include <scsi/scsi_device.h>
26#include <scsi/scsi_tcq.h>
27#include <scsi/scsi_dbg.h>
28#include <scsi/scsi_transport_spi.h>
29
30#include "esp_scsi.h"
31
32#define DRV_MODULE_NAME "esp"
33#define PFX DRV_MODULE_NAME ": "
34#define DRV_VERSION "2.000"
35#define DRV_MODULE_RELDATE "April 19, 2007"
36
37/* SCSI bus reset settle time in seconds. */
38static int esp_bus_reset_settle = 3;
39
40static u32 esp_debug;
41#define ESP_DEBUG_INTR 0x00000001
42#define ESP_DEBUG_SCSICMD 0x00000002
43#define ESP_DEBUG_RESET 0x00000004
44#define ESP_DEBUG_MSGIN 0x00000008
45#define ESP_DEBUG_MSGOUT 0x00000010
46#define ESP_DEBUG_CMDDONE 0x00000020
47#define ESP_DEBUG_DISCONNECT 0x00000040
48#define ESP_DEBUG_DATASTART 0x00000080
49#define ESP_DEBUG_DATADONE 0x00000100
50#define ESP_DEBUG_RECONNECT 0x00000200
51#define ESP_DEBUG_AUTOSENSE 0x00000400
Hannes Reinecke1af6f602014-11-24 15:37:22 +010052#define ESP_DEBUG_EVENT 0x00000800
53#define ESP_DEBUG_COMMAND 0x00001000
David S. Millercd9ad582007-04-26 21:19:23 -070054
55#define esp_log_intr(f, a...) \
56do { if (esp_debug & ESP_DEBUG_INTR) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010057 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070058} while (0)
59
60#define esp_log_reset(f, a...) \
61do { if (esp_debug & ESP_DEBUG_RESET) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010062 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070063} while (0)
64
65#define esp_log_msgin(f, a...) \
66do { if (esp_debug & ESP_DEBUG_MSGIN) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010067 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070068} while (0)
69
70#define esp_log_msgout(f, a...) \
71do { if (esp_debug & ESP_DEBUG_MSGOUT) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010072 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070073} while (0)
74
75#define esp_log_cmddone(f, a...) \
76do { if (esp_debug & ESP_DEBUG_CMDDONE) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010077 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070078} while (0)
79
80#define esp_log_disconnect(f, a...) \
81do { if (esp_debug & ESP_DEBUG_DISCONNECT) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010082 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070083} while (0)
84
85#define esp_log_datastart(f, a...) \
86do { if (esp_debug & ESP_DEBUG_DATASTART) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010087 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070088} while (0)
89
90#define esp_log_datadone(f, a...) \
91do { if (esp_debug & ESP_DEBUG_DATADONE) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010092 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070093} while (0)
94
95#define esp_log_reconnect(f, a...) \
96do { if (esp_debug & ESP_DEBUG_RECONNECT) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +010097 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -070098} while (0)
99
100#define esp_log_autosense(f, a...) \
101do { if (esp_debug & ESP_DEBUG_AUTOSENSE) \
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100102 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
David S. Millercd9ad582007-04-26 21:19:23 -0700103} while (0)
104
Hannes Reinecke1af6f602014-11-24 15:37:22 +0100105#define esp_log_event(f, a...) \
106do { if (esp_debug & ESP_DEBUG_EVENT) \
107 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
108} while (0)
109
110#define esp_log_command(f, a...) \
111do { if (esp_debug & ESP_DEBUG_COMMAND) \
112 shost_printk(KERN_DEBUG, esp->host, f, ## a); \
113} while (0)
114
David S. Millercd9ad582007-04-26 21:19:23 -0700115#define esp_read8(REG) esp->ops->esp_read8(esp, REG)
116#define esp_write8(VAL,REG) esp->ops->esp_write8(esp, VAL, REG)
117
118static void esp_log_fill_regs(struct esp *esp,
119 struct esp_event_ent *p)
120{
121 p->sreg = esp->sreg;
122 p->seqreg = esp->seqreg;
123 p->sreg2 = esp->sreg2;
124 p->ireg = esp->ireg;
125 p->select_state = esp->select_state;
126 p->event = esp->event;
127}
128
129void scsi_esp_cmd(struct esp *esp, u8 val)
130{
131 struct esp_event_ent *p;
132 int idx = esp->esp_event_cur;
133
134 p = &esp->esp_event_log[idx];
135 p->type = ESP_EVENT_TYPE_CMD;
136 p->val = val;
137 esp_log_fill_regs(esp, p);
138
139 esp->esp_event_cur = (idx + 1) & (ESP_EVENT_LOG_SZ - 1);
140
Hannes Reinecke1af6f602014-11-24 15:37:22 +0100141 esp_log_command("cmd[%02x]\n", val);
David S. Millercd9ad582007-04-26 21:19:23 -0700142 esp_write8(val, ESP_CMD);
143}
144EXPORT_SYMBOL(scsi_esp_cmd);
145
Hannes Reinecke31708662014-11-24 15:37:24 +0100146static void esp_send_dma_cmd(struct esp *esp, int len, int max_len, int cmd)
147{
148 if (esp->flags & ESP_FLAG_USE_FIFO) {
149 int i;
150
151 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
152 for (i = 0; i < len; i++)
153 esp_write8(esp->command_block[i], ESP_FDATA);
154 scsi_esp_cmd(esp, cmd);
155 } else {
156 if (esp->rev == FASHME)
157 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
158 cmd |= ESP_CMD_DMA;
159 esp->ops->send_dma_cmd(esp, esp->command_block_dma,
160 len, max_len, 0, cmd);
161 }
162}
163
David S. Millercd9ad582007-04-26 21:19:23 -0700164static void esp_event(struct esp *esp, u8 val)
165{
166 struct esp_event_ent *p;
167 int idx = esp->esp_event_cur;
168
169 p = &esp->esp_event_log[idx];
170 p->type = ESP_EVENT_TYPE_EVENT;
171 p->val = val;
172 esp_log_fill_regs(esp, p);
173
174 esp->esp_event_cur = (idx + 1) & (ESP_EVENT_LOG_SZ - 1);
175
176 esp->event = val;
177}
178
179static void esp_dump_cmd_log(struct esp *esp)
180{
181 int idx = esp->esp_event_cur;
182 int stop = idx;
183
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100184 shost_printk(KERN_INFO, esp->host, "Dumping command log\n");
David S. Millercd9ad582007-04-26 21:19:23 -0700185 do {
186 struct esp_event_ent *p = &esp->esp_event_log[idx];
187
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100188 shost_printk(KERN_INFO, esp->host,
189 "ent[%d] %s val[%02x] sreg[%02x] seqreg[%02x] "
190 "sreg2[%02x] ireg[%02x] ss[%02x] event[%02x]\n",
191 idx,
192 p->type == ESP_EVENT_TYPE_CMD ? "CMD" : "EVENT",
193 p->val, p->sreg, p->seqreg,
194 p->sreg2, p->ireg, p->select_state, p->event);
David S. Millercd9ad582007-04-26 21:19:23 -0700195
196 idx = (idx + 1) & (ESP_EVENT_LOG_SZ - 1);
197 } while (idx != stop);
198}
199
200static void esp_flush_fifo(struct esp *esp)
201{
202 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
203 if (esp->rev == ESP236) {
204 int lim = 1000;
205
206 while (esp_read8(ESP_FFLAGS) & ESP_FF_FBYTES) {
207 if (--lim == 0) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100208 shost_printk(KERN_ALERT, esp->host,
209 "ESP_FF_BYTES will not clear!\n");
David S. Millercd9ad582007-04-26 21:19:23 -0700210 break;
211 }
212 udelay(1);
213 }
214 }
215}
216
217static void hme_read_fifo(struct esp *esp)
218{
219 int fcnt = esp_read8(ESP_FFLAGS) & ESP_FF_FBYTES;
220 int idx = 0;
221
222 while (fcnt--) {
223 esp->fifo[idx++] = esp_read8(ESP_FDATA);
224 esp->fifo[idx++] = esp_read8(ESP_FDATA);
225 }
226 if (esp->sreg2 & ESP_STAT2_F1BYTE) {
227 esp_write8(0, ESP_FDATA);
228 esp->fifo[idx++] = esp_read8(ESP_FDATA);
229 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
230 }
231 esp->fifo_cnt = idx;
232}
233
234static void esp_set_all_config3(struct esp *esp, u8 val)
235{
236 int i;
237
238 for (i = 0; i < ESP_MAX_TARGET; i++)
239 esp->target[i].esp_config3 = val;
240}
241
242/* Reset the ESP chip, _not_ the SCSI bus. */
243static void esp_reset_esp(struct esp *esp)
244{
245 u8 family_code, version;
246
247 /* Now reset the ESP chip */
248 scsi_esp_cmd(esp, ESP_CMD_RC);
249 scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
David S. Millera7938042007-09-30 17:10:42 -0700250 if (esp->rev == FAST)
251 esp_write8(ESP_CONFIG2_FENAB, ESP_CFG2);
David S. Millercd9ad582007-04-26 21:19:23 -0700252 scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
253
David S. Millercd9ad582007-04-26 21:19:23 -0700254 /* This is the only point at which it is reliable to read
255 * the ID-code for a fast ESP chip variants.
256 */
257 esp->max_period = ((35 * esp->ccycle) / 1000);
258 if (esp->rev == FAST) {
259 version = esp_read8(ESP_UID);
260 family_code = (version & 0xf8) >> 3;
261 if (family_code == 0x02)
262 esp->rev = FAS236;
263 else if (family_code == 0x0a)
264 esp->rev = FASHME; /* Version is usually '5'. */
265 else
266 esp->rev = FAS100A;
267 esp->min_period = ((4 * esp->ccycle) / 1000);
268 } else {
269 esp->min_period = ((5 * esp->ccycle) / 1000);
270 }
Hannes Reineckeeeea2f92014-11-24 15:37:27 +0100271 if (esp->rev == FAS236) {
272 /*
273 * The AM53c974 chip returns the same ID as FAS236;
274 * try to configure glitch eater.
275 */
276 u8 config4 = ESP_CONFIG4_GE1;
277 esp_write8(config4, ESP_CFG4);
278 config4 = esp_read8(ESP_CFG4);
279 if (config4 & ESP_CONFIG4_GE1) {
280 esp->rev = PCSCSI;
281 esp_write8(esp->config4, ESP_CFG4);
282 }
283 }
David S. Millercd9ad582007-04-26 21:19:23 -0700284 esp->max_period = (esp->max_period + 3)>>2;
285 esp->min_period = (esp->min_period + 3)>>2;
286
287 esp_write8(esp->config1, ESP_CFG1);
288 switch (esp->rev) {
289 case ESP100:
290 /* nothing to do */
291 break;
292
293 case ESP100A:
294 esp_write8(esp->config2, ESP_CFG2);
295 break;
296
297 case ESP236:
298 /* Slow 236 */
299 esp_write8(esp->config2, ESP_CFG2);
300 esp->prev_cfg3 = esp->target[0].esp_config3;
301 esp_write8(esp->prev_cfg3, ESP_CFG3);
302 break;
303
304 case FASHME:
305 esp->config2 |= (ESP_CONFIG2_HME32 | ESP_CONFIG2_HMEFENAB);
306 /* fallthrough... */
307
308 case FAS236:
Hannes Reineckeeeea2f92014-11-24 15:37:27 +0100309 case PCSCSI:
310 /* Fast 236, AM53c974 or HME */
David S. Millercd9ad582007-04-26 21:19:23 -0700311 esp_write8(esp->config2, ESP_CFG2);
312 if (esp->rev == FASHME) {
313 u8 cfg3 = esp->target[0].esp_config3;
314
315 cfg3 |= ESP_CONFIG3_FCLOCK | ESP_CONFIG3_OBPUSH;
316 if (esp->scsi_id >= 8)
317 cfg3 |= ESP_CONFIG3_IDBIT3;
318 esp_set_all_config3(esp, cfg3);
319 } else {
320 u32 cfg3 = esp->target[0].esp_config3;
321
322 cfg3 |= ESP_CONFIG3_FCLK;
323 esp_set_all_config3(esp, cfg3);
324 }
325 esp->prev_cfg3 = esp->target[0].esp_config3;
326 esp_write8(esp->prev_cfg3, ESP_CFG3);
327 if (esp->rev == FASHME) {
328 esp->radelay = 80;
329 } else {
330 if (esp->flags & ESP_FLAG_DIFFERENTIAL)
331 esp->radelay = 0;
332 else
333 esp->radelay = 96;
334 }
335 break;
336
337 case FAS100A:
338 /* Fast 100a */
339 esp_write8(esp->config2, ESP_CFG2);
340 esp_set_all_config3(esp,
341 (esp->target[0].esp_config3 |
342 ESP_CONFIG3_FCLOCK));
343 esp->prev_cfg3 = esp->target[0].esp_config3;
344 esp_write8(esp->prev_cfg3, ESP_CFG3);
345 esp->radelay = 32;
346 break;
347
348 default:
349 break;
350 }
351
David S. Millera7938042007-09-30 17:10:42 -0700352 /* Reload the configuration registers */
353 esp_write8(esp->cfact, ESP_CFACT);
354
355 esp->prev_stp = 0;
356 esp_write8(esp->prev_stp, ESP_STP);
357
358 esp->prev_soff = 0;
359 esp_write8(esp->prev_soff, ESP_SOFF);
360
361 esp_write8(esp->neg_defp, ESP_TIMEO);
362
David S. Millercd9ad582007-04-26 21:19:23 -0700363 /* Eat any bitrot in the chip */
364 esp_read8(ESP_INTRPT);
365 udelay(100);
366}
367
368static void esp_map_dma(struct esp *esp, struct scsi_cmnd *cmd)
369{
370 struct esp_cmd_priv *spriv = ESP_CMD_PRIV(cmd);
FUJITA Tomonori4c2baaa2007-05-26 04:51:32 +0900371 struct scatterlist *sg = scsi_sglist(cmd);
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200372 int total = 0, i;
David S. Millercd9ad582007-04-26 21:19:23 -0700373
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200374 if (cmd->sc_data_direction == DMA_NONE)
David S. Millercd9ad582007-04-26 21:19:23 -0700375 return;
376
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200377 if (esp->flags & ESP_FLAG_NO_DMA_MAP) {
378 /*
379 * For pseudo DMA and PIO we need the virtual address instead of
380 * a dma address, so perform an identity mapping.
381 */
Christoph Hellwig86117d72018-10-13 09:26:28 +0200382 spriv->num_sg = scsi_sg_count(cmd);
383 for (i = 0; i < spriv->num_sg; i++) {
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200384 sg[i].dma_address = (uintptr_t)sg_virt(&sg[i]);
385 total += sg_dma_len(&sg[i]);
386 }
387 } else {
Christoph Hellwig86117d72018-10-13 09:26:28 +0200388 spriv->num_sg = scsi_dma_map(cmd);
389 for (i = 0; i < spriv->num_sg; i++)
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200390 total += sg_dma_len(&sg[i]);
391 }
David S. Millercd9ad582007-04-26 21:19:23 -0700392 spriv->cur_residue = sg_dma_len(sg);
393 spriv->cur_sg = sg;
David S. Millercd9ad582007-04-26 21:19:23 -0700394 spriv->tot_residue = total;
395}
396
397static dma_addr_t esp_cur_dma_addr(struct esp_cmd_entry *ent,
398 struct scsi_cmnd *cmd)
399{
400 struct esp_cmd_priv *p = ESP_CMD_PRIV(cmd);
401
402 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
403 return ent->sense_dma +
404 (ent->sense_ptr - cmd->sense_buffer);
405 }
406
407 return sg_dma_address(p->cur_sg) +
408 (sg_dma_len(p->cur_sg) -
409 p->cur_residue);
410}
411
412static unsigned int esp_cur_dma_len(struct esp_cmd_entry *ent,
413 struct scsi_cmnd *cmd)
414{
415 struct esp_cmd_priv *p = ESP_CMD_PRIV(cmd);
416
417 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
418 return SCSI_SENSE_BUFFERSIZE -
419 (ent->sense_ptr - cmd->sense_buffer);
420 }
421 return p->cur_residue;
422}
423
424static void esp_advance_dma(struct esp *esp, struct esp_cmd_entry *ent,
425 struct scsi_cmnd *cmd, unsigned int len)
426{
427 struct esp_cmd_priv *p = ESP_CMD_PRIV(cmd);
428
429 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
430 ent->sense_ptr += len;
431 return;
432 }
433
434 p->cur_residue -= len;
435 p->tot_residue -= len;
436 if (p->cur_residue < 0 || p->tot_residue < 0) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100437 shost_printk(KERN_ERR, esp->host,
438 "Data transfer overflow.\n");
439 shost_printk(KERN_ERR, esp->host,
440 "cur_residue[%d] tot_residue[%d] len[%u]\n",
441 p->cur_residue, p->tot_residue, len);
David S. Millercd9ad582007-04-26 21:19:23 -0700442 p->cur_residue = 0;
443 p->tot_residue = 0;
444 }
445 if (!p->cur_residue && p->tot_residue) {
446 p->cur_sg++;
447 p->cur_residue = sg_dma_len(p->cur_sg);
448 }
449}
450
451static void esp_unmap_dma(struct esp *esp, struct scsi_cmnd *cmd)
452{
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200453 if (!(esp->flags & ESP_FLAG_NO_DMA_MAP))
454 scsi_dma_unmap(cmd);
David S. Millercd9ad582007-04-26 21:19:23 -0700455}
456
457static void esp_save_pointers(struct esp *esp, struct esp_cmd_entry *ent)
458{
459 struct scsi_cmnd *cmd = ent->cmd;
460 struct esp_cmd_priv *spriv = ESP_CMD_PRIV(cmd);
461
462 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
463 ent->saved_sense_ptr = ent->sense_ptr;
464 return;
465 }
466 ent->saved_cur_residue = spriv->cur_residue;
467 ent->saved_cur_sg = spriv->cur_sg;
468 ent->saved_tot_residue = spriv->tot_residue;
469}
470
471static void esp_restore_pointers(struct esp *esp, struct esp_cmd_entry *ent)
472{
473 struct scsi_cmnd *cmd = ent->cmd;
474 struct esp_cmd_priv *spriv = ESP_CMD_PRIV(cmd);
475
476 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
477 ent->sense_ptr = ent->saved_sense_ptr;
478 return;
479 }
480 spriv->cur_residue = ent->saved_cur_residue;
481 spriv->cur_sg = ent->saved_cur_sg;
482 spriv->tot_residue = ent->saved_tot_residue;
483}
484
David S. Millercd9ad582007-04-26 21:19:23 -0700485static void esp_write_tgt_config3(struct esp *esp, int tgt)
486{
487 if (esp->rev > ESP100A) {
488 u8 val = esp->target[tgt].esp_config3;
489
490 if (val != esp->prev_cfg3) {
491 esp->prev_cfg3 = val;
492 esp_write8(val, ESP_CFG3);
493 }
494 }
495}
496
497static void esp_write_tgt_sync(struct esp *esp, int tgt)
498{
499 u8 off = esp->target[tgt].esp_offset;
500 u8 per = esp->target[tgt].esp_period;
501
502 if (off != esp->prev_soff) {
503 esp->prev_soff = off;
504 esp_write8(off, ESP_SOFF);
505 }
506 if (per != esp->prev_stp) {
507 esp->prev_stp = per;
508 esp_write8(per, ESP_STP);
509 }
510}
511
512static u32 esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32 dma_len)
513{
514 if (esp->rev == FASHME) {
515 /* Arbitrary segment boundaries, 24-bit counts. */
516 if (dma_len > (1U << 24))
517 dma_len = (1U << 24);
518 } else {
519 u32 base, end;
520
521 /* ESP chip limits other variants by 16-bits of transfer
522 * count. Actually on FAS100A and FAS236 we could get
523 * 24-bits of transfer count by enabling ESP_CONFIG2_FENAB
524 * in the ESP_CFG2 register but that causes other unwanted
525 * changes so we don't use it currently.
526 */
527 if (dma_len > (1U << 16))
528 dma_len = (1U << 16);
529
530 /* All of the DMA variants hooked up to these chips
531 * cannot handle crossing a 24-bit address boundary.
532 */
533 base = dma_addr & ((1U << 24) - 1U);
534 end = base + dma_len;
535 if (end > (1U << 24))
536 end = (1U <<24);
537 dma_len = end - base;
538 }
539 return dma_len;
540}
541
542static int esp_need_to_nego_wide(struct esp_target_data *tp)
543{
544 struct scsi_target *target = tp->starget;
545
546 return spi_width(target) != tp->nego_goal_width;
547}
548
549static int esp_need_to_nego_sync(struct esp_target_data *tp)
550{
551 struct scsi_target *target = tp->starget;
552
553 /* When offset is zero, period is "don't care". */
554 if (!spi_offset(target) && !tp->nego_goal_offset)
555 return 0;
556
557 if (spi_offset(target) == tp->nego_goal_offset &&
558 spi_period(target) == tp->nego_goal_period)
559 return 0;
560
561 return 1;
562}
563
564static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,
565 struct esp_lun_data *lp)
566{
David S. Miller21af8102013-08-01 18:08:34 -0700567 if (!ent->orig_tag[0]) {
David S. Millercd9ad582007-04-26 21:19:23 -0700568 /* Non-tagged, slot already taken? */
569 if (lp->non_tagged_cmd)
570 return -EBUSY;
571
572 if (lp->hold) {
573 /* We are being held by active tagged
574 * commands.
575 */
576 if (lp->num_tagged)
577 return -EBUSY;
578
579 /* Tagged commands completed, we can unplug
580 * the queue and run this untagged command.
581 */
582 lp->hold = 0;
583 } else if (lp->num_tagged) {
584 /* Plug the queue until num_tagged decreases
585 * to zero in esp_free_lun_tag.
586 */
587 lp->hold = 1;
588 return -EBUSY;
589 }
590
591 lp->non_tagged_cmd = ent;
592 return 0;
David S. Millercd9ad582007-04-26 21:19:23 -0700593 }
594
Finn Thain201c37d2017-08-04 01:43:19 -0400595 /* Tagged command. Check that it isn't blocked by a non-tagged one. */
596 if (lp->non_tagged_cmd || lp->hold)
597 return -EBUSY;
598
David S. Miller21af8102013-08-01 18:08:34 -0700599 BUG_ON(lp->tagged_cmds[ent->orig_tag[1]]);
David S. Millercd9ad582007-04-26 21:19:23 -0700600
David S. Miller21af8102013-08-01 18:08:34 -0700601 lp->tagged_cmds[ent->orig_tag[1]] = ent;
David S. Millercd9ad582007-04-26 21:19:23 -0700602 lp->num_tagged++;
603
604 return 0;
605}
606
607static void esp_free_lun_tag(struct esp_cmd_entry *ent,
608 struct esp_lun_data *lp)
609{
David S. Miller21af8102013-08-01 18:08:34 -0700610 if (ent->orig_tag[0]) {
611 BUG_ON(lp->tagged_cmds[ent->orig_tag[1]] != ent);
612 lp->tagged_cmds[ent->orig_tag[1]] = NULL;
David S. Millercd9ad582007-04-26 21:19:23 -0700613 lp->num_tagged--;
614 } else {
615 BUG_ON(lp->non_tagged_cmd != ent);
616 lp->non_tagged_cmd = NULL;
617 }
618}
619
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200620static void esp_map_sense(struct esp *esp, struct esp_cmd_entry *ent)
621{
622 ent->sense_ptr = ent->cmd->sense_buffer;
623 if (esp->flags & ESP_FLAG_NO_DMA_MAP) {
624 ent->sense_dma = (uintptr_t)ent->sense_ptr;
625 return;
626 }
627
628 ent->sense_dma = dma_map_single(esp->dev, ent->sense_ptr,
629 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
630}
631
632static void esp_unmap_sense(struct esp *esp, struct esp_cmd_entry *ent)
633{
634 if (!(esp->flags & ESP_FLAG_NO_DMA_MAP))
635 dma_unmap_single(esp->dev, ent->sense_dma,
636 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
637 ent->sense_ptr = NULL;
638}
639
David S. Millercd9ad582007-04-26 21:19:23 -0700640/* When a contingent allegiance conditon is created, we force feed a
641 * REQUEST_SENSE command to the device to fetch the sense data. I
642 * tried many other schemes, relying on the scsi error handling layer
643 * to send out the REQUEST_SENSE automatically, but this was difficult
644 * to get right especially in the presence of applications like smartd
645 * which use SG_IO to send out their own REQUEST_SENSE commands.
646 */
647static void esp_autosense(struct esp *esp, struct esp_cmd_entry *ent)
648{
649 struct scsi_cmnd *cmd = ent->cmd;
650 struct scsi_device *dev = cmd->device;
651 int tgt, lun;
652 u8 *p, val;
653
654 tgt = dev->id;
655 lun = dev->lun;
656
657
658 if (!ent->sense_ptr) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100659 esp_log_autosense("Doing auto-sense for tgt[%d] lun[%d]\n",
660 tgt, lun);
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200661 esp_map_sense(esp, ent);
David S. Millercd9ad582007-04-26 21:19:23 -0700662 }
663 ent->saved_sense_ptr = ent->sense_ptr;
664
665 esp->active_cmd = ent;
666
667 p = esp->command_block;
668 esp->msg_out_len = 0;
669
670 *p++ = IDENTIFY(0, lun);
671 *p++ = REQUEST_SENSE;
672 *p++ = ((dev->scsi_level <= SCSI_2) ?
673 (lun << 5) : 0);
674 *p++ = 0;
675 *p++ = 0;
676 *p++ = SCSI_SENSE_BUFFERSIZE;
677 *p++ = 0;
678
679 esp->select_state = ESP_SELECT_BASIC;
680
681 val = tgt;
682 if (esp->rev == FASHME)
683 val |= ESP_BUSID_RESELID | ESP_BUSID_CTR32BIT;
684 esp_write8(val, ESP_BUSID);
685
686 esp_write_tgt_sync(esp, tgt);
687 esp_write_tgt_config3(esp, tgt);
688
689 val = (p - esp->command_block);
690
Hannes Reinecke31708662014-11-24 15:37:24 +0100691 esp_send_dma_cmd(esp, val, 16, ESP_CMD_SELA);
David S. Millercd9ad582007-04-26 21:19:23 -0700692}
693
694static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp)
695{
696 struct esp_cmd_entry *ent;
697
698 list_for_each_entry(ent, &esp->queued_cmds, list) {
699 struct scsi_cmnd *cmd = ent->cmd;
700 struct scsi_device *dev = cmd->device;
701 struct esp_lun_data *lp = dev->hostdata;
702
703 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
704 ent->tag[0] = 0;
705 ent->tag[1] = 0;
706 return ent;
707 }
708
Christoph Hellwig50668632014-10-30 14:30:06 +0100709 if (!spi_populate_tag_msg(&ent->tag[0], cmd)) {
David S. Millercd9ad582007-04-26 21:19:23 -0700710 ent->tag[0] = 0;
711 ent->tag[1] = 0;
712 }
David S. Miller21af8102013-08-01 18:08:34 -0700713 ent->orig_tag[0] = ent->tag[0];
714 ent->orig_tag[1] = ent->tag[1];
David S. Millercd9ad582007-04-26 21:19:23 -0700715
716 if (esp_alloc_lun_tag(ent, lp) < 0)
717 continue;
718
719 return ent;
720 }
721
722 return NULL;
723}
724
725static void esp_maybe_execute_command(struct esp *esp)
726{
727 struct esp_target_data *tp;
David S. Millercd9ad582007-04-26 21:19:23 -0700728 struct scsi_device *dev;
729 struct scsi_cmnd *cmd;
730 struct esp_cmd_entry *ent;
Finn Thain8bca2142018-10-16 16:31:25 +1100731 bool select_and_stop = false;
David S. Millercd9ad582007-04-26 21:19:23 -0700732 int tgt, lun, i;
733 u32 val, start_cmd;
734 u8 *p;
735
736 if (esp->active_cmd ||
737 (esp->flags & ESP_FLAG_RESETTING))
738 return;
739
740 ent = find_and_prep_issuable_command(esp);
741 if (!ent)
742 return;
743
744 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
745 esp_autosense(esp, ent);
746 return;
747 }
748
749 cmd = ent->cmd;
750 dev = cmd->device;
751 tgt = dev->id;
752 lun = dev->lun;
753 tp = &esp->target[tgt];
David S. Millercd9ad582007-04-26 21:19:23 -0700754
Kirill A. Shutemov63ce2492011-04-01 16:06:09 -0700755 list_move(&ent->list, &esp->active_cmds);
David S. Millercd9ad582007-04-26 21:19:23 -0700756
757 esp->active_cmd = ent;
758
759 esp_map_dma(esp, cmd);
760 esp_save_pointers(esp, ent);
761
Finn Thain8bca2142018-10-16 16:31:25 +1100762 if (!(cmd->cmd_len == 6 || cmd->cmd_len == 10 || cmd->cmd_len == 12))
763 select_and_stop = true;
David S. Millercd9ad582007-04-26 21:19:23 -0700764
765 p = esp->command_block;
766
767 esp->msg_out_len = 0;
768 if (tp->flags & ESP_TGT_CHECK_NEGO) {
769 /* Need to negotiate. If the target is broken
770 * go for synchronous transfers and non-wide.
771 */
772 if (tp->flags & ESP_TGT_BROKEN) {
773 tp->flags &= ~ESP_TGT_DISCONNECT;
774 tp->nego_goal_period = 0;
775 tp->nego_goal_offset = 0;
776 tp->nego_goal_width = 0;
777 tp->nego_goal_tags = 0;
778 }
779
780 /* If the settings are not changing, skip this. */
781 if (spi_width(tp->starget) == tp->nego_goal_width &&
782 spi_period(tp->starget) == tp->nego_goal_period &&
783 spi_offset(tp->starget) == tp->nego_goal_offset) {
784 tp->flags &= ~ESP_TGT_CHECK_NEGO;
785 goto build_identify;
786 }
787
788 if (esp->rev == FASHME && esp_need_to_nego_wide(tp)) {
789 esp->msg_out_len =
790 spi_populate_width_msg(&esp->msg_out[0],
791 (tp->nego_goal_width ?
792 1 : 0));
793 tp->flags |= ESP_TGT_NEGO_WIDE;
794 } else if (esp_need_to_nego_sync(tp)) {
795 esp->msg_out_len =
796 spi_populate_sync_msg(&esp->msg_out[0],
797 tp->nego_goal_period,
798 tp->nego_goal_offset);
799 tp->flags |= ESP_TGT_NEGO_SYNC;
800 } else {
801 tp->flags &= ~ESP_TGT_CHECK_NEGO;
802 }
803
Finn Thain8bca2142018-10-16 16:31:25 +1100804 /* If there are multiple message bytes, use Select and Stop */
805 if (esp->msg_out_len)
806 select_and_stop = true;
David S. Millercd9ad582007-04-26 21:19:23 -0700807 }
808
809build_identify:
Finn Thain87c58ef2018-10-16 16:31:25 +1100810 *p++ = IDENTIFY(tp->flags & ESP_TGT_DISCONNECT, lun);
David S. Millercd9ad582007-04-26 21:19:23 -0700811
812 if (ent->tag[0] && esp->rev == ESP100) {
813 /* ESP100 lacks select w/atn3 command, use select
814 * and stop instead.
815 */
Finn Thain8bca2142018-10-16 16:31:25 +1100816 select_and_stop = true;
David S. Millercd9ad582007-04-26 21:19:23 -0700817 }
818
Finn Thain8bca2142018-10-16 16:31:25 +1100819 if (select_and_stop) {
David S. Millercd9ad582007-04-26 21:19:23 -0700820 esp->cmd_bytes_left = cmd->cmd_len;
821 esp->cmd_bytes_ptr = &cmd->cmnd[0];
822
823 if (ent->tag[0]) {
824 for (i = esp->msg_out_len - 1;
825 i >= 0; i--)
826 esp->msg_out[i + 2] = esp->msg_out[i];
827 esp->msg_out[0] = ent->tag[0];
828 esp->msg_out[1] = ent->tag[1];
829 esp->msg_out_len += 2;
830 }
831
Hannes Reinecke31708662014-11-24 15:37:24 +0100832 start_cmd = ESP_CMD_SELAS;
David S. Millercd9ad582007-04-26 21:19:23 -0700833 esp->select_state = ESP_SELECT_MSGOUT;
Finn Thain8bca2142018-10-16 16:31:25 +1100834 } else {
835 start_cmd = ESP_CMD_SELA;
836 if (ent->tag[0]) {
837 *p++ = ent->tag[0];
838 *p++ = ent->tag[1];
839
840 start_cmd = ESP_CMD_SA3;
841 }
842
843 for (i = 0; i < cmd->cmd_len; i++)
844 *p++ = cmd->cmnd[i];
845
846 esp->select_state = ESP_SELECT_BASIC;
David S. Millercd9ad582007-04-26 21:19:23 -0700847 }
848 val = tgt;
849 if (esp->rev == FASHME)
850 val |= ESP_BUSID_RESELID | ESP_BUSID_CTR32BIT;
851 esp_write8(val, ESP_BUSID);
852
853 esp_write_tgt_sync(esp, tgt);
854 esp_write_tgt_config3(esp, tgt);
855
856 val = (p - esp->command_block);
857
858 if (esp_debug & ESP_DEBUG_SCSICMD) {
859 printk("ESP: tgt[%d] lun[%d] scsi_cmd [ ", tgt, lun);
860 for (i = 0; i < cmd->cmd_len; i++)
861 printk("%02x ", cmd->cmnd[i]);
862 printk("]\n");
863 }
864
Hannes Reinecke31708662014-11-24 15:37:24 +0100865 esp_send_dma_cmd(esp, val, 16, start_cmd);
David S. Millercd9ad582007-04-26 21:19:23 -0700866}
867
868static struct esp_cmd_entry *esp_get_ent(struct esp *esp)
869{
870 struct list_head *head = &esp->esp_cmd_pool;
871 struct esp_cmd_entry *ret;
872
873 if (list_empty(head)) {
874 ret = kzalloc(sizeof(struct esp_cmd_entry), GFP_ATOMIC);
875 } else {
876 ret = list_entry(head->next, struct esp_cmd_entry, list);
877 list_del(&ret->list);
878 memset(ret, 0, sizeof(*ret));
879 }
880 return ret;
881}
882
883static void esp_put_ent(struct esp *esp, struct esp_cmd_entry *ent)
884{
885 list_add(&ent->list, &esp->esp_cmd_pool);
886}
887
888static void esp_cmd_is_done(struct esp *esp, struct esp_cmd_entry *ent,
889 struct scsi_cmnd *cmd, unsigned int result)
890{
891 struct scsi_device *dev = cmd->device;
892 int tgt = dev->id;
893 int lun = dev->lun;
894
895 esp->active_cmd = NULL;
896 esp_unmap_dma(esp, cmd);
897 esp_free_lun_tag(ent, dev->hostdata);
898 cmd->result = result;
899
900 if (ent->eh_done) {
901 complete(ent->eh_done);
902 ent->eh_done = NULL;
903 }
904
905 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE) {
Christoph Hellwig3f9295b2018-10-13 09:26:27 +0200906 esp_unmap_sense(esp, ent);
David S. Millercd9ad582007-04-26 21:19:23 -0700907
908 /* Restore the message/status bytes to what we actually
909 * saw originally. Also, report that we are providing
910 * the sense data.
911 */
912 cmd->result = ((DRIVER_SENSE << 24) |
913 (DID_OK << 16) |
914 (COMMAND_COMPLETE << 8) |
915 (SAM_STAT_CHECK_CONDITION << 0));
916
917 ent->flags &= ~ESP_CMD_FLAG_AUTOSENSE;
918 if (esp_debug & ESP_DEBUG_AUTOSENSE) {
919 int i;
920
921 printk("esp%d: tgt[%d] lun[%d] AUTO SENSE[ ",
922 esp->host->unique_id, tgt, lun);
923 for (i = 0; i < 18; i++)
924 printk("%02x ", cmd->sense_buffer[i]);
925 printk("]\n");
926 }
927 }
928
929 cmd->scsi_done(cmd);
930
931 list_del(&ent->list);
932 esp_put_ent(esp, ent);
933
934 esp_maybe_execute_command(esp);
935}
936
937static unsigned int compose_result(unsigned int status, unsigned int message,
938 unsigned int driver_code)
939{
940 return (status | (message << 8) | (driver_code << 16));
941}
942
943static void esp_event_queue_full(struct esp *esp, struct esp_cmd_entry *ent)
944{
945 struct scsi_device *dev = ent->cmd->device;
946 struct esp_lun_data *lp = dev->hostdata;
947
948 scsi_track_queue_full(dev, lp->num_tagged - 1);
949}
950
Jeff Garzikf2812332010-11-16 02:10:29 -0500951static int esp_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
David S. Millercd9ad582007-04-26 21:19:23 -0700952{
953 struct scsi_device *dev = cmd->device;
Christoph Hellwig2b14ec72007-05-31 20:12:32 +0200954 struct esp *esp = shost_priv(dev->host);
David S. Millercd9ad582007-04-26 21:19:23 -0700955 struct esp_cmd_priv *spriv;
956 struct esp_cmd_entry *ent;
957
958 ent = esp_get_ent(esp);
959 if (!ent)
960 return SCSI_MLQUEUE_HOST_BUSY;
961
962 ent->cmd = cmd;
963
964 cmd->scsi_done = done;
965
966 spriv = ESP_CMD_PRIV(cmd);
Christoph Hellwig86117d72018-10-13 09:26:28 +0200967 spriv->num_sg = 0;
David S. Millercd9ad582007-04-26 21:19:23 -0700968
969 list_add_tail(&ent->list, &esp->queued_cmds);
970
971 esp_maybe_execute_command(esp);
972
973 return 0;
974}
975
Jeff Garzikf2812332010-11-16 02:10:29 -0500976static DEF_SCSI_QCMD(esp_queuecommand)
977
David S. Millercd9ad582007-04-26 21:19:23 -0700978static int esp_check_gross_error(struct esp *esp)
979{
980 if (esp->sreg & ESP_STAT_SPAM) {
981 /* Gross Error, could be one of:
982 * - top of fifo overwritten
983 * - top of command register overwritten
984 * - DMA programmed with wrong direction
985 * - improper phase change
986 */
Hannes Reineckea1a75b32014-11-24 15:37:21 +0100987 shost_printk(KERN_ERR, esp->host,
988 "Gross error sreg[%02x]\n", esp->sreg);
David S. Millercd9ad582007-04-26 21:19:23 -0700989 /* XXX Reset the chip. XXX */
990 return 1;
991 }
992 return 0;
993}
994
995static int esp_check_spur_intr(struct esp *esp)
996{
997 switch (esp->rev) {
998 case ESP100:
999 case ESP100A:
1000 /* The interrupt pending bit of the status register cannot
1001 * be trusted on these revisions.
1002 */
1003 esp->sreg &= ~ESP_STAT_INTR;
1004 break;
1005
1006 default:
1007 if (!(esp->sreg & ESP_STAT_INTR)) {
David S. Millercd9ad582007-04-26 21:19:23 -07001008 if (esp->ireg & ESP_INTR_SR)
1009 return 1;
1010
1011 /* If the DMA is indicating interrupt pending and the
1012 * ESP is not, the only possibility is a DMA error.
1013 */
1014 if (!esp->ops->dma_error(esp)) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001015 shost_printk(KERN_ERR, esp->host,
1016 "Spurious irq, sreg=%02x.\n",
1017 esp->sreg);
David S. Millercd9ad582007-04-26 21:19:23 -07001018 return -1;
1019 }
1020
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001021 shost_printk(KERN_ERR, esp->host, "DMA error\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001022
1023 /* XXX Reset the chip. XXX */
1024 return -1;
1025 }
1026 break;
1027 }
1028
1029 return 0;
1030}
1031
1032static void esp_schedule_reset(struct esp *esp)
1033{
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001034 esp_log_reset("esp_schedule_reset() from %pf\n",
David S. Millercd9ad582007-04-26 21:19:23 -07001035 __builtin_return_address(0));
1036 esp->flags |= ESP_FLAG_RESETTING;
1037 esp_event(esp, ESP_EVENT_RESET);
1038}
1039
1040/* In order to avoid having to add a special half-reconnected state
1041 * into the driver we just sit here and poll through the rest of
1042 * the reselection process to get the tag message bytes.
1043 */
1044static struct esp_cmd_entry *esp_reconnect_with_tag(struct esp *esp,
1045 struct esp_lun_data *lp)
1046{
1047 struct esp_cmd_entry *ent;
1048 int i;
1049
1050 if (!lp->num_tagged) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001051 shost_printk(KERN_ERR, esp->host,
1052 "Reconnect w/num_tagged==0\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001053 return NULL;
1054 }
1055
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001056 esp_log_reconnect("reconnect tag, ");
David S. Millercd9ad582007-04-26 21:19:23 -07001057
1058 for (i = 0; i < ESP_QUICKIRQ_LIMIT; i++) {
1059 if (esp->ops->irq_pending(esp))
1060 break;
1061 }
1062 if (i == ESP_QUICKIRQ_LIMIT) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001063 shost_printk(KERN_ERR, esp->host,
1064 "Reconnect IRQ1 timeout\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001065 return NULL;
1066 }
1067
1068 esp->sreg = esp_read8(ESP_STATUS);
1069 esp->ireg = esp_read8(ESP_INTRPT);
1070
1071 esp_log_reconnect("IRQ(%d:%x:%x), ",
1072 i, esp->ireg, esp->sreg);
1073
1074 if (esp->ireg & ESP_INTR_DC) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001075 shost_printk(KERN_ERR, esp->host,
1076 "Reconnect, got disconnect.\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001077 return NULL;
1078 }
1079
1080 if ((esp->sreg & ESP_STAT_PMASK) != ESP_MIP) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001081 shost_printk(KERN_ERR, esp->host,
1082 "Reconnect, not MIP sreg[%02x].\n", esp->sreg);
David S. Millercd9ad582007-04-26 21:19:23 -07001083 return NULL;
1084 }
1085
1086 /* DMA in the tag bytes... */
1087 esp->command_block[0] = 0xff;
1088 esp->command_block[1] = 0xff;
1089 esp->ops->send_dma_cmd(esp, esp->command_block_dma,
1090 2, 2, 1, ESP_CMD_DMA | ESP_CMD_TI);
1091
Justin P. Mattock70f23fd2011-05-10 10:16:21 +02001092 /* ACK the message. */
David S. Millercd9ad582007-04-26 21:19:23 -07001093 scsi_esp_cmd(esp, ESP_CMD_MOK);
1094
1095 for (i = 0; i < ESP_RESELECT_TAG_LIMIT; i++) {
1096 if (esp->ops->irq_pending(esp)) {
1097 esp->sreg = esp_read8(ESP_STATUS);
1098 esp->ireg = esp_read8(ESP_INTRPT);
1099 if (esp->ireg & ESP_INTR_FDONE)
1100 break;
1101 }
1102 udelay(1);
1103 }
1104 if (i == ESP_RESELECT_TAG_LIMIT) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001105 shost_printk(KERN_ERR, esp->host, "Reconnect IRQ2 timeout\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001106 return NULL;
1107 }
1108 esp->ops->dma_drain(esp);
1109 esp->ops->dma_invalidate(esp);
1110
1111 esp_log_reconnect("IRQ2(%d:%x:%x) tag[%x:%x]\n",
1112 i, esp->ireg, esp->sreg,
1113 esp->command_block[0],
1114 esp->command_block[1]);
1115
1116 if (esp->command_block[0] < SIMPLE_QUEUE_TAG ||
1117 esp->command_block[0] > ORDERED_QUEUE_TAG) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001118 shost_printk(KERN_ERR, esp->host,
1119 "Reconnect, bad tag type %02x.\n",
1120 esp->command_block[0]);
David S. Millercd9ad582007-04-26 21:19:23 -07001121 return NULL;
1122 }
1123
1124 ent = lp->tagged_cmds[esp->command_block[1]];
1125 if (!ent) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001126 shost_printk(KERN_ERR, esp->host,
1127 "Reconnect, no entry for tag %02x.\n",
1128 esp->command_block[1]);
David S. Millercd9ad582007-04-26 21:19:23 -07001129 return NULL;
1130 }
1131
1132 return ent;
1133}
1134
1135static int esp_reconnect(struct esp *esp)
1136{
1137 struct esp_cmd_entry *ent;
1138 struct esp_target_data *tp;
1139 struct esp_lun_data *lp;
1140 struct scsi_device *dev;
1141 int target, lun;
1142
1143 BUG_ON(esp->active_cmd);
1144 if (esp->rev == FASHME) {
1145 /* FASHME puts the target and lun numbers directly
1146 * into the fifo.
1147 */
1148 target = esp->fifo[0];
1149 lun = esp->fifo[1] & 0x7;
1150 } else {
1151 u8 bits = esp_read8(ESP_FDATA);
1152
1153 /* Older chips put the lun directly into the fifo, but
1154 * the target is given as a sample of the arbitration
1155 * lines on the bus at reselection time. So we should
1156 * see the ID of the ESP and the one reconnecting target
1157 * set in the bitmap.
1158 */
1159 if (!(bits & esp->scsi_id_mask))
1160 goto do_reset;
1161 bits &= ~esp->scsi_id_mask;
1162 if (!bits || (bits & (bits - 1)))
1163 goto do_reset;
1164
1165 target = ffs(bits) - 1;
1166 lun = (esp_read8(ESP_FDATA) & 0x7);
1167
1168 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1169 if (esp->rev == ESP100) {
1170 u8 ireg = esp_read8(ESP_INTRPT);
1171 /* This chip has a bug during reselection that can
1172 * cause a spurious illegal-command interrupt, which
1173 * we simply ACK here. Another possibility is a bus
1174 * reset so we must check for that.
1175 */
1176 if (ireg & ESP_INTR_SR)
1177 goto do_reset;
1178 }
1179 scsi_esp_cmd(esp, ESP_CMD_NULL);
1180 }
1181
1182 esp_write_tgt_sync(esp, target);
1183 esp_write_tgt_config3(esp, target);
1184
1185 scsi_esp_cmd(esp, ESP_CMD_MOK);
1186
1187 if (esp->rev == FASHME)
1188 esp_write8(target | ESP_BUSID_RESELID | ESP_BUSID_CTR32BIT,
1189 ESP_BUSID);
1190
1191 tp = &esp->target[target];
1192 dev = __scsi_device_lookup_by_target(tp->starget, lun);
1193 if (!dev) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001194 shost_printk(KERN_ERR, esp->host,
1195 "Reconnect, no lp tgt[%u] lun[%u]\n",
1196 target, lun);
David S. Millercd9ad582007-04-26 21:19:23 -07001197 goto do_reset;
1198 }
1199 lp = dev->hostdata;
1200
1201 ent = lp->non_tagged_cmd;
1202 if (!ent) {
1203 ent = esp_reconnect_with_tag(esp, lp);
1204 if (!ent)
1205 goto do_reset;
1206 }
1207
1208 esp->active_cmd = ent;
1209
David S. Millercd9ad582007-04-26 21:19:23 -07001210 esp_event(esp, ESP_EVENT_CHECK_PHASE);
1211 esp_restore_pointers(esp, ent);
1212 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1213 return 1;
1214
1215do_reset:
1216 esp_schedule_reset(esp);
1217 return 0;
1218}
1219
1220static int esp_finish_select(struct esp *esp)
1221{
1222 struct esp_cmd_entry *ent;
1223 struct scsi_cmnd *cmd;
David S. Millercd9ad582007-04-26 21:19:23 -07001224
1225 /* No longer selecting. */
1226 esp->select_state = ESP_SELECT_NONE;
1227
1228 esp->seqreg = esp_read8(ESP_SSTEP) & ESP_STEP_VBITS;
1229 ent = esp->active_cmd;
1230 cmd = ent->cmd;
1231
1232 if (esp->ops->dma_error(esp)) {
1233 /* If we see a DMA error during or as a result of selection,
1234 * all bets are off.
1235 */
1236 esp_schedule_reset(esp);
1237 esp_cmd_is_done(esp, ent, cmd, (DID_ERROR << 16));
1238 return 0;
1239 }
1240
1241 esp->ops->dma_invalidate(esp);
1242
1243 if (esp->ireg == (ESP_INTR_RSEL | ESP_INTR_FDONE)) {
1244 struct esp_target_data *tp = &esp->target[cmd->device->id];
1245
1246 /* Carefully back out of the selection attempt. Release
1247 * resources (such as DMA mapping & TAG) and reset state (such
1248 * as message out and command delivery variables).
1249 */
1250 if (!(ent->flags & ESP_CMD_FLAG_AUTOSENSE)) {
1251 esp_unmap_dma(esp, cmd);
1252 esp_free_lun_tag(ent, cmd->device->hostdata);
1253 tp->flags &= ~(ESP_TGT_NEGO_SYNC | ESP_TGT_NEGO_WIDE);
David S. Millercd9ad582007-04-26 21:19:23 -07001254 esp->cmd_bytes_ptr = NULL;
1255 esp->cmd_bytes_left = 0;
1256 } else {
Christoph Hellwig3f9295b2018-10-13 09:26:27 +02001257 esp_unmap_sense(esp, ent);
David S. Millercd9ad582007-04-26 21:19:23 -07001258 }
1259
1260 /* Now that the state is unwound properly, put back onto
1261 * the issue queue. This command is no longer active.
1262 */
Kirill A. Shutemov63ce2492011-04-01 16:06:09 -07001263 list_move(&ent->list, &esp->queued_cmds);
David S. Millercd9ad582007-04-26 21:19:23 -07001264 esp->active_cmd = NULL;
1265
1266 /* Return value ignored by caller, it directly invokes
1267 * esp_reconnect().
1268 */
1269 return 0;
1270 }
1271
1272 if (esp->ireg == ESP_INTR_DC) {
1273 struct scsi_device *dev = cmd->device;
1274
1275 /* Disconnect. Make sure we re-negotiate sync and
1276 * wide parameters if this target starts responding
1277 * again in the future.
1278 */
1279 esp->target[dev->id].flags |= ESP_TGT_CHECK_NEGO;
1280
1281 scsi_esp_cmd(esp, ESP_CMD_ESEL);
1282 esp_cmd_is_done(esp, ent, cmd, (DID_BAD_TARGET << 16));
1283 return 1;
1284 }
1285
1286 if (esp->ireg == (ESP_INTR_FDONE | ESP_INTR_BSERV)) {
1287 /* Selection successful. On pre-FAST chips we have
1288 * to do a NOP and possibly clean out the FIFO.
1289 */
1290 if (esp->rev <= ESP236) {
1291 int fcnt = esp_read8(ESP_FFLAGS) & ESP_FF_FBYTES;
1292
1293 scsi_esp_cmd(esp, ESP_CMD_NULL);
1294
1295 if (!fcnt &&
1296 (!esp->prev_soff ||
1297 ((esp->sreg & ESP_STAT_PMASK) != ESP_DIP)))
1298 esp_flush_fifo(esp);
1299 }
1300
Finn Thain8bca2142018-10-16 16:31:25 +11001301 /* If we are doing a Select And Stop command, negotiation, etc.
1302 * we'll do the right thing as we transition to the next phase.
David S. Millercd9ad582007-04-26 21:19:23 -07001303 */
1304 esp_event(esp, ESP_EVENT_CHECK_PHASE);
1305 return 0;
1306 }
1307
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001308 shost_printk(KERN_INFO, esp->host,
1309 "Unexpected selection completion ireg[%x]\n", esp->ireg);
David S. Millercd9ad582007-04-26 21:19:23 -07001310 esp_schedule_reset(esp);
1311 return 0;
1312}
1313
1314static int esp_data_bytes_sent(struct esp *esp, struct esp_cmd_entry *ent,
1315 struct scsi_cmnd *cmd)
1316{
1317 int fifo_cnt, ecount, bytes_sent, flush_fifo;
1318
1319 fifo_cnt = esp_read8(ESP_FFLAGS) & ESP_FF_FBYTES;
1320 if (esp->prev_cfg3 & ESP_CONFIG3_EWIDE)
1321 fifo_cnt <<= 1;
1322
1323 ecount = 0;
1324 if (!(esp->sreg & ESP_STAT_TCNT)) {
1325 ecount = ((unsigned int)esp_read8(ESP_TCLOW) |
1326 (((unsigned int)esp_read8(ESP_TCMED)) << 8));
1327 if (esp->rev == FASHME)
1328 ecount |= ((unsigned int)esp_read8(FAS_RLO)) << 16;
Hannes Reineckee858d932014-11-24 15:37:29 +01001329 if (esp->rev == PCSCSI && (esp->config2 & ESP_CONFIG2_FENAB))
1330 ecount |= ((unsigned int)esp_read8(ESP_TCHI)) << 16;
David S. Millercd9ad582007-04-26 21:19:23 -07001331 }
1332
1333 bytes_sent = esp->data_dma_len;
1334 bytes_sent -= ecount;
Finn Thainfd47d912018-10-16 16:31:25 +11001335 bytes_sent -= esp->send_cmd_residual;
David S. Millercd9ad582007-04-26 21:19:23 -07001336
Hannes Reinecke6df388f2014-11-24 15:37:26 +01001337 /*
1338 * The am53c974 has a DMA 'pecularity'. The doc states:
1339 * In some odd byte conditions, one residual byte will
1340 * be left in the SCSI FIFO, and the FIFO Flags will
1341 * never count to '0 '. When this happens, the residual
1342 * byte should be retrieved via PIO following completion
1343 * of the BLAST operation.
1344 */
1345 if (fifo_cnt == 1 && ent->flags & ESP_CMD_FLAG_RESIDUAL) {
1346 size_t count = 1;
1347 size_t offset = bytes_sent;
1348 u8 bval = esp_read8(ESP_FDATA);
1349
1350 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE)
1351 ent->sense_ptr[bytes_sent] = bval;
1352 else {
1353 struct esp_cmd_priv *p = ESP_CMD_PRIV(cmd);
1354 u8 *ptr;
1355
Christoph Hellwig86117d72018-10-13 09:26:28 +02001356 ptr = scsi_kmap_atomic_sg(p->cur_sg, p->num_sg,
Hannes Reinecke6df388f2014-11-24 15:37:26 +01001357 &offset, &count);
1358 if (likely(ptr)) {
1359 *(ptr + offset) = bval;
1360 scsi_kunmap_atomic_sg(ptr);
1361 }
1362 }
1363 bytes_sent += fifo_cnt;
1364 ent->flags &= ~ESP_CMD_FLAG_RESIDUAL;
1365 }
David S. Millercd9ad582007-04-26 21:19:23 -07001366 if (!(ent->flags & ESP_CMD_FLAG_WRITE))
1367 bytes_sent -= fifo_cnt;
1368
1369 flush_fifo = 0;
1370 if (!esp->prev_soff) {
1371 /* Synchronous data transfer, always flush fifo. */
1372 flush_fifo = 1;
1373 } else {
1374 if (esp->rev == ESP100) {
1375 u32 fflags, phase;
1376
1377 /* ESP100 has a chip bug where in the synchronous data
1378 * phase it can mistake a final long REQ pulse from the
1379 * target as an extra data byte. Fun.
1380 *
1381 * To detect this case we resample the status register
1382 * and fifo flags. If we're still in a data phase and
1383 * we see spurious chunks in the fifo, we return error
1384 * to the caller which should reset and set things up
1385 * such that we only try future transfers to this
1386 * target in synchronous mode.
1387 */
1388 esp->sreg = esp_read8(ESP_STATUS);
1389 phase = esp->sreg & ESP_STAT_PMASK;
1390 fflags = esp_read8(ESP_FFLAGS);
1391
1392 if ((phase == ESP_DOP &&
1393 (fflags & ESP_FF_ONOTZERO)) ||
1394 (phase == ESP_DIP &&
1395 (fflags & ESP_FF_FBYTES)))
1396 return -1;
1397 }
1398 if (!(ent->flags & ESP_CMD_FLAG_WRITE))
1399 flush_fifo = 1;
1400 }
1401
1402 if (flush_fifo)
1403 esp_flush_fifo(esp);
1404
1405 return bytes_sent;
1406}
1407
1408static void esp_setsync(struct esp *esp, struct esp_target_data *tp,
1409 u8 scsi_period, u8 scsi_offset,
1410 u8 esp_stp, u8 esp_soff)
1411{
1412 spi_period(tp->starget) = scsi_period;
1413 spi_offset(tp->starget) = scsi_offset;
1414 spi_width(tp->starget) = (tp->flags & ESP_TGT_WIDE) ? 1 : 0;
1415
1416 if (esp_soff) {
1417 esp_stp &= 0x1f;
1418 esp_soff |= esp->radelay;
1419 if (esp->rev >= FAS236) {
1420 u8 bit = ESP_CONFIG3_FSCSI;
1421 if (esp->rev >= FAS100A)
1422 bit = ESP_CONFIG3_FAST;
1423
1424 if (scsi_period < 50) {
1425 if (esp->rev == FASHME)
1426 esp_soff &= ~esp->radelay;
1427 tp->esp_config3 |= bit;
1428 } else {
1429 tp->esp_config3 &= ~bit;
1430 }
1431 esp->prev_cfg3 = tp->esp_config3;
1432 esp_write8(esp->prev_cfg3, ESP_CFG3);
1433 }
1434 }
1435
1436 tp->esp_period = esp->prev_stp = esp_stp;
1437 tp->esp_offset = esp->prev_soff = esp_soff;
1438
1439 esp_write8(esp_soff, ESP_SOFF);
1440 esp_write8(esp_stp, ESP_STP);
1441
1442 tp->flags &= ~(ESP_TGT_NEGO_SYNC | ESP_TGT_CHECK_NEGO);
1443
1444 spi_display_xfer_agreement(tp->starget);
1445}
1446
1447static void esp_msgin_reject(struct esp *esp)
1448{
1449 struct esp_cmd_entry *ent = esp->active_cmd;
1450 struct scsi_cmnd *cmd = ent->cmd;
1451 struct esp_target_data *tp;
1452 int tgt;
1453
1454 tgt = cmd->device->id;
1455 tp = &esp->target[tgt];
1456
1457 if (tp->flags & ESP_TGT_NEGO_WIDE) {
1458 tp->flags &= ~(ESP_TGT_NEGO_WIDE | ESP_TGT_WIDE);
1459
1460 if (!esp_need_to_nego_sync(tp)) {
1461 tp->flags &= ~ESP_TGT_CHECK_NEGO;
1462 scsi_esp_cmd(esp, ESP_CMD_RATN);
1463 } else {
1464 esp->msg_out_len =
1465 spi_populate_sync_msg(&esp->msg_out[0],
1466 tp->nego_goal_period,
1467 tp->nego_goal_offset);
1468 tp->flags |= ESP_TGT_NEGO_SYNC;
1469 scsi_esp_cmd(esp, ESP_CMD_SATN);
1470 }
1471 return;
1472 }
1473
1474 if (tp->flags & ESP_TGT_NEGO_SYNC) {
1475 tp->flags &= ~(ESP_TGT_NEGO_SYNC | ESP_TGT_CHECK_NEGO);
1476 tp->esp_period = 0;
1477 tp->esp_offset = 0;
1478 esp_setsync(esp, tp, 0, 0, 0, 0);
1479 scsi_esp_cmd(esp, ESP_CMD_RATN);
1480 return;
1481 }
1482
Finn Thainc69edff52017-08-04 01:43:20 -04001483 shost_printk(KERN_INFO, esp->host, "Unexpected MESSAGE REJECT\n");
1484 esp_schedule_reset(esp);
David S. Millercd9ad582007-04-26 21:19:23 -07001485}
1486
1487static void esp_msgin_sdtr(struct esp *esp, struct esp_target_data *tp)
1488{
1489 u8 period = esp->msg_in[3];
1490 u8 offset = esp->msg_in[4];
1491 u8 stp;
1492
1493 if (!(tp->flags & ESP_TGT_NEGO_SYNC))
1494 goto do_reject;
1495
1496 if (offset > 15)
1497 goto do_reject;
1498
1499 if (offset) {
Julia Lawall237abac2008-10-29 14:24:40 -07001500 int one_clock;
David S. Millercd9ad582007-04-26 21:19:23 -07001501
1502 if (period > esp->max_period) {
1503 period = offset = 0;
1504 goto do_sdtr;
1505 }
1506 if (period < esp->min_period)
1507 goto do_reject;
1508
1509 one_clock = esp->ccycle / 1000;
Julia Lawall237abac2008-10-29 14:24:40 -07001510 stp = DIV_ROUND_UP(period << 2, one_clock);
David S. Millercd9ad582007-04-26 21:19:23 -07001511 if (stp && esp->rev >= FAS236) {
1512 if (stp >= 50)
1513 stp--;
1514 }
1515 } else {
1516 stp = 0;
1517 }
1518
1519 esp_setsync(esp, tp, period, offset, stp, offset);
1520 return;
1521
1522do_reject:
1523 esp->msg_out[0] = MESSAGE_REJECT;
1524 esp->msg_out_len = 1;
1525 scsi_esp_cmd(esp, ESP_CMD_SATN);
1526 return;
1527
1528do_sdtr:
1529 tp->nego_goal_period = period;
1530 tp->nego_goal_offset = offset;
1531 esp->msg_out_len =
1532 spi_populate_sync_msg(&esp->msg_out[0],
1533 tp->nego_goal_period,
1534 tp->nego_goal_offset);
1535 scsi_esp_cmd(esp, ESP_CMD_SATN);
1536}
1537
1538static void esp_msgin_wdtr(struct esp *esp, struct esp_target_data *tp)
1539{
1540 int size = 8 << esp->msg_in[3];
1541 u8 cfg3;
1542
1543 if (esp->rev != FASHME)
1544 goto do_reject;
1545
1546 if (size != 8 && size != 16)
1547 goto do_reject;
1548
1549 if (!(tp->flags & ESP_TGT_NEGO_WIDE))
1550 goto do_reject;
1551
1552 cfg3 = tp->esp_config3;
1553 if (size == 16) {
1554 tp->flags |= ESP_TGT_WIDE;
1555 cfg3 |= ESP_CONFIG3_EWIDE;
1556 } else {
1557 tp->flags &= ~ESP_TGT_WIDE;
1558 cfg3 &= ~ESP_CONFIG3_EWIDE;
1559 }
1560 tp->esp_config3 = cfg3;
1561 esp->prev_cfg3 = cfg3;
1562 esp_write8(cfg3, ESP_CFG3);
1563
1564 tp->flags &= ~ESP_TGT_NEGO_WIDE;
1565
1566 spi_period(tp->starget) = 0;
1567 spi_offset(tp->starget) = 0;
1568 if (!esp_need_to_nego_sync(tp)) {
1569 tp->flags &= ~ESP_TGT_CHECK_NEGO;
1570 scsi_esp_cmd(esp, ESP_CMD_RATN);
1571 } else {
1572 esp->msg_out_len =
1573 spi_populate_sync_msg(&esp->msg_out[0],
1574 tp->nego_goal_period,
1575 tp->nego_goal_offset);
1576 tp->flags |= ESP_TGT_NEGO_SYNC;
1577 scsi_esp_cmd(esp, ESP_CMD_SATN);
1578 }
1579 return;
1580
1581do_reject:
1582 esp->msg_out[0] = MESSAGE_REJECT;
1583 esp->msg_out_len = 1;
1584 scsi_esp_cmd(esp, ESP_CMD_SATN);
1585}
1586
1587static void esp_msgin_extended(struct esp *esp)
1588{
1589 struct esp_cmd_entry *ent = esp->active_cmd;
1590 struct scsi_cmnd *cmd = ent->cmd;
1591 struct esp_target_data *tp;
1592 int tgt = cmd->device->id;
1593
1594 tp = &esp->target[tgt];
1595 if (esp->msg_in[2] == EXTENDED_SDTR) {
1596 esp_msgin_sdtr(esp, tp);
1597 return;
1598 }
1599 if (esp->msg_in[2] == EXTENDED_WDTR) {
1600 esp_msgin_wdtr(esp, tp);
1601 return;
1602 }
1603
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001604 shost_printk(KERN_INFO, esp->host,
1605 "Unexpected extended msg type %x\n", esp->msg_in[2]);
David S. Millercd9ad582007-04-26 21:19:23 -07001606
Finn Thainc69edff52017-08-04 01:43:20 -04001607 esp->msg_out[0] = MESSAGE_REJECT;
David S. Millercd9ad582007-04-26 21:19:23 -07001608 esp->msg_out_len = 1;
1609 scsi_esp_cmd(esp, ESP_CMD_SATN);
1610}
1611
1612/* Analyze msgin bytes received from target so far. Return non-zero
1613 * if there are more bytes needed to complete the message.
1614 */
1615static int esp_msgin_process(struct esp *esp)
1616{
1617 u8 msg0 = esp->msg_in[0];
1618 int len = esp->msg_in_len;
1619
1620 if (msg0 & 0x80) {
1621 /* Identify */
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001622 shost_printk(KERN_INFO, esp->host,
1623 "Unexpected msgin identify\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001624 return 0;
1625 }
1626
1627 switch (msg0) {
1628 case EXTENDED_MESSAGE:
1629 if (len == 1)
1630 return 1;
1631 if (len < esp->msg_in[1] + 2)
1632 return 1;
1633 esp_msgin_extended(esp);
1634 return 0;
1635
1636 case IGNORE_WIDE_RESIDUE: {
1637 struct esp_cmd_entry *ent;
1638 struct esp_cmd_priv *spriv;
1639 if (len == 1)
1640 return 1;
1641
1642 if (esp->msg_in[1] != 1)
1643 goto do_reject;
1644
1645 ent = esp->active_cmd;
1646 spriv = ESP_CMD_PRIV(ent->cmd);
1647
1648 if (spriv->cur_residue == sg_dma_len(spriv->cur_sg)) {
1649 spriv->cur_sg--;
1650 spriv->cur_residue = 1;
1651 } else
1652 spriv->cur_residue++;
1653 spriv->tot_residue++;
1654 return 0;
1655 }
1656 case NOP:
1657 return 0;
1658 case RESTORE_POINTERS:
1659 esp_restore_pointers(esp, esp->active_cmd);
1660 return 0;
1661 case SAVE_POINTERS:
1662 esp_save_pointers(esp, esp->active_cmd);
1663 return 0;
1664
1665 case COMMAND_COMPLETE:
1666 case DISCONNECT: {
1667 struct esp_cmd_entry *ent = esp->active_cmd;
1668
1669 ent->message = msg0;
1670 esp_event(esp, ESP_EVENT_FREE_BUS);
1671 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1672 return 0;
1673 }
1674 case MESSAGE_REJECT:
1675 esp_msgin_reject(esp);
1676 return 0;
1677
1678 default:
1679 do_reject:
1680 esp->msg_out[0] = MESSAGE_REJECT;
1681 esp->msg_out_len = 1;
1682 scsi_esp_cmd(esp, ESP_CMD_SATN);
1683 return 0;
1684 }
1685}
1686
1687static int esp_process_event(struct esp *esp)
1688{
Hannes Reinecke31708662014-11-24 15:37:24 +01001689 int write, i;
David S. Millercd9ad582007-04-26 21:19:23 -07001690
1691again:
1692 write = 0;
Hannes Reinecke1af6f602014-11-24 15:37:22 +01001693 esp_log_event("process event %d phase %x\n",
1694 esp->event, esp->sreg & ESP_STAT_PMASK);
David S. Millercd9ad582007-04-26 21:19:23 -07001695 switch (esp->event) {
1696 case ESP_EVENT_CHECK_PHASE:
1697 switch (esp->sreg & ESP_STAT_PMASK) {
1698 case ESP_DOP:
1699 esp_event(esp, ESP_EVENT_DATA_OUT);
1700 break;
1701 case ESP_DIP:
1702 esp_event(esp, ESP_EVENT_DATA_IN);
1703 break;
1704 case ESP_STATP:
1705 esp_flush_fifo(esp);
1706 scsi_esp_cmd(esp, ESP_CMD_ICCSEQ);
1707 esp_event(esp, ESP_EVENT_STATUS);
1708 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1709 return 1;
1710
1711 case ESP_MOP:
1712 esp_event(esp, ESP_EVENT_MSGOUT);
1713 break;
1714
1715 case ESP_MIP:
1716 esp_event(esp, ESP_EVENT_MSGIN);
1717 break;
1718
1719 case ESP_CMDP:
1720 esp_event(esp, ESP_EVENT_CMD_START);
1721 break;
1722
1723 default:
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001724 shost_printk(KERN_INFO, esp->host,
1725 "Unexpected phase, sreg=%02x\n",
1726 esp->sreg);
David S. Millercd9ad582007-04-26 21:19:23 -07001727 esp_schedule_reset(esp);
1728 return 0;
1729 }
1730 goto again;
David S. Millercd9ad582007-04-26 21:19:23 -07001731
1732 case ESP_EVENT_DATA_IN:
1733 write = 1;
1734 /* fallthru */
1735
1736 case ESP_EVENT_DATA_OUT: {
1737 struct esp_cmd_entry *ent = esp->active_cmd;
1738 struct scsi_cmnd *cmd = ent->cmd;
1739 dma_addr_t dma_addr = esp_cur_dma_addr(ent, cmd);
1740 unsigned int dma_len = esp_cur_dma_len(ent, cmd);
1741
1742 if (esp->rev == ESP100)
1743 scsi_esp_cmd(esp, ESP_CMD_NULL);
1744
1745 if (write)
1746 ent->flags |= ESP_CMD_FLAG_WRITE;
1747 else
1748 ent->flags &= ~ESP_CMD_FLAG_WRITE;
1749
Finn Thain6fe07aa2008-04-25 10:06:05 -05001750 if (esp->ops->dma_length_limit)
1751 dma_len = esp->ops->dma_length_limit(esp, dma_addr,
1752 dma_len);
1753 else
1754 dma_len = esp_dma_length_limit(esp, dma_addr, dma_len);
1755
David S. Millercd9ad582007-04-26 21:19:23 -07001756 esp->data_dma_len = dma_len;
1757
1758 if (!dma_len) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001759 shost_printk(KERN_ERR, esp->host,
1760 "DMA length is zero!\n");
1761 shost_printk(KERN_ERR, esp->host,
1762 "cur adr[%08llx] len[%08x]\n",
1763 (unsigned long long)esp_cur_dma_addr(ent, cmd),
1764 esp_cur_dma_len(ent, cmd));
David S. Millercd9ad582007-04-26 21:19:23 -07001765 esp_schedule_reset(esp);
1766 return 0;
1767 }
1768
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001769 esp_log_datastart("start data addr[%08llx] len[%u] write(%d)\n",
Alexey Dobriyane1f2a092007-04-27 15:19:27 -07001770 (unsigned long long)dma_addr, dma_len, write);
David S. Millercd9ad582007-04-26 21:19:23 -07001771
1772 esp->ops->send_dma_cmd(esp, dma_addr, dma_len, dma_len,
1773 write, ESP_CMD_DMA | ESP_CMD_TI);
1774 esp_event(esp, ESP_EVENT_DATA_DONE);
1775 break;
1776 }
1777 case ESP_EVENT_DATA_DONE: {
1778 struct esp_cmd_entry *ent = esp->active_cmd;
1779 struct scsi_cmnd *cmd = ent->cmd;
1780 int bytes_sent;
1781
1782 if (esp->ops->dma_error(esp)) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001783 shost_printk(KERN_INFO, esp->host,
1784 "data done, DMA error, resetting\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001785 esp_schedule_reset(esp);
1786 return 0;
1787 }
1788
1789 if (ent->flags & ESP_CMD_FLAG_WRITE) {
1790 /* XXX parity errors, etc. XXX */
1791
1792 esp->ops->dma_drain(esp);
1793 }
1794 esp->ops->dma_invalidate(esp);
1795
1796 if (esp->ireg != ESP_INTR_BSERV) {
1797 /* We should always see exactly a bus-service
1798 * interrupt at the end of a successful transfer.
1799 */
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001800 shost_printk(KERN_INFO, esp->host,
1801 "data done, not BSERV, resetting\n");
David S. Millercd9ad582007-04-26 21:19:23 -07001802 esp_schedule_reset(esp);
1803 return 0;
1804 }
1805
1806 bytes_sent = esp_data_bytes_sent(esp, ent, cmd);
1807
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001808 esp_log_datadone("data done flgs[%x] sent[%d]\n",
David S. Millercd9ad582007-04-26 21:19:23 -07001809 ent->flags, bytes_sent);
1810
1811 if (bytes_sent < 0) {
1812 /* XXX force sync mode for this target XXX */
1813 esp_schedule_reset(esp);
1814 return 0;
1815 }
1816
1817 esp_advance_dma(esp, ent, cmd, bytes_sent);
1818 esp_event(esp, ESP_EVENT_CHECK_PHASE);
1819 goto again;
David S. Millercd9ad582007-04-26 21:19:23 -07001820 }
1821
1822 case ESP_EVENT_STATUS: {
1823 struct esp_cmd_entry *ent = esp->active_cmd;
1824
1825 if (esp->ireg & ESP_INTR_FDONE) {
1826 ent->status = esp_read8(ESP_FDATA);
1827 ent->message = esp_read8(ESP_FDATA);
1828 scsi_esp_cmd(esp, ESP_CMD_MOK);
1829 } else if (esp->ireg == ESP_INTR_BSERV) {
1830 ent->status = esp_read8(ESP_FDATA);
1831 ent->message = 0xff;
1832 esp_event(esp, ESP_EVENT_MSGIN);
1833 return 0;
1834 }
1835
1836 if (ent->message != COMMAND_COMPLETE) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001837 shost_printk(KERN_INFO, esp->host,
1838 "Unexpected message %x in status\n",
1839 ent->message);
David S. Millercd9ad582007-04-26 21:19:23 -07001840 esp_schedule_reset(esp);
1841 return 0;
1842 }
1843
1844 esp_event(esp, ESP_EVENT_FREE_BUS);
1845 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1846 break;
1847 }
1848 case ESP_EVENT_FREE_BUS: {
1849 struct esp_cmd_entry *ent = esp->active_cmd;
1850 struct scsi_cmnd *cmd = ent->cmd;
1851
1852 if (ent->message == COMMAND_COMPLETE ||
1853 ent->message == DISCONNECT)
1854 scsi_esp_cmd(esp, ESP_CMD_ESEL);
1855
1856 if (ent->message == COMMAND_COMPLETE) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001857 esp_log_cmddone("Command done status[%x] message[%x]\n",
David S. Millercd9ad582007-04-26 21:19:23 -07001858 ent->status, ent->message);
1859 if (ent->status == SAM_STAT_TASK_SET_FULL)
1860 esp_event_queue_full(esp, ent);
1861
1862 if (ent->status == SAM_STAT_CHECK_CONDITION &&
1863 !(ent->flags & ESP_CMD_FLAG_AUTOSENSE)) {
1864 ent->flags |= ESP_CMD_FLAG_AUTOSENSE;
1865 esp_autosense(esp, ent);
1866 } else {
1867 esp_cmd_is_done(esp, ent, cmd,
1868 compose_result(ent->status,
1869 ent->message,
1870 DID_OK));
1871 }
1872 } else if (ent->message == DISCONNECT) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001873 esp_log_disconnect("Disconnecting tgt[%d] tag[%x:%x]\n",
David S. Millercd9ad582007-04-26 21:19:23 -07001874 cmd->device->id,
1875 ent->tag[0], ent->tag[1]);
1876
1877 esp->active_cmd = NULL;
1878 esp_maybe_execute_command(esp);
1879 } else {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001880 shost_printk(KERN_INFO, esp->host,
1881 "Unexpected message %x in freebus\n",
1882 ent->message);
David S. Millercd9ad582007-04-26 21:19:23 -07001883 esp_schedule_reset(esp);
1884 return 0;
1885 }
1886 if (esp->active_cmd)
1887 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1888 break;
1889 }
1890 case ESP_EVENT_MSGOUT: {
1891 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1892
1893 if (esp_debug & ESP_DEBUG_MSGOUT) {
1894 int i;
1895 printk("ESP: Sending message [ ");
1896 for (i = 0; i < esp->msg_out_len; i++)
1897 printk("%02x ", esp->msg_out[i]);
1898 printk("]\n");
1899 }
1900
1901 if (esp->rev == FASHME) {
1902 int i;
1903
1904 /* Always use the fifo. */
1905 for (i = 0; i < esp->msg_out_len; i++) {
1906 esp_write8(esp->msg_out[i], ESP_FDATA);
1907 esp_write8(0, ESP_FDATA);
1908 }
1909 scsi_esp_cmd(esp, ESP_CMD_TI);
1910 } else {
1911 if (esp->msg_out_len == 1) {
1912 esp_write8(esp->msg_out[0], ESP_FDATA);
1913 scsi_esp_cmd(esp, ESP_CMD_TI);
Hannes Reinecke31708662014-11-24 15:37:24 +01001914 } else if (esp->flags & ESP_FLAG_USE_FIFO) {
1915 for (i = 0; i < esp->msg_out_len; i++)
1916 esp_write8(esp->msg_out[i], ESP_FDATA);
1917 scsi_esp_cmd(esp, ESP_CMD_TI);
David S. Millercd9ad582007-04-26 21:19:23 -07001918 } else {
1919 /* Use DMA. */
1920 memcpy(esp->command_block,
1921 esp->msg_out,
1922 esp->msg_out_len);
1923
1924 esp->ops->send_dma_cmd(esp,
1925 esp->command_block_dma,
1926 esp->msg_out_len,
1927 esp->msg_out_len,
1928 0,
1929 ESP_CMD_DMA|ESP_CMD_TI);
1930 }
1931 }
1932 esp_event(esp, ESP_EVENT_MSGOUT_DONE);
1933 break;
1934 }
1935 case ESP_EVENT_MSGOUT_DONE:
1936 if (esp->rev == FASHME) {
1937 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1938 } else {
1939 if (esp->msg_out_len > 1)
1940 esp->ops->dma_invalidate(esp);
David S. Millercd9ad582007-04-26 21:19:23 -07001941
Finn Thain201c37d2017-08-04 01:43:19 -04001942 /* XXX if the chip went into disconnected mode,
1943 * we can't run the phase state machine anyway.
1944 */
1945 if (!(esp->ireg & ESP_INTR_DC))
David S. Millercd9ad582007-04-26 21:19:23 -07001946 scsi_esp_cmd(esp, ESP_CMD_NULL);
1947 }
Finn Thain201c37d2017-08-04 01:43:19 -04001948
Finn Thaind60e9ee2017-08-04 01:43:20 -04001949 esp->msg_out_len = 0;
1950
David S. Millercd9ad582007-04-26 21:19:23 -07001951 esp_event(esp, ESP_EVENT_CHECK_PHASE);
1952 goto again;
1953 case ESP_EVENT_MSGIN:
1954 if (esp->ireg & ESP_INTR_BSERV) {
1955 if (esp->rev == FASHME) {
1956 if (!(esp_read8(ESP_STATUS2) &
1957 ESP_STAT2_FEMPTY))
1958 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1959 } else {
1960 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1961 if (esp->rev == ESP100)
1962 scsi_esp_cmd(esp, ESP_CMD_NULL);
1963 }
1964 scsi_esp_cmd(esp, ESP_CMD_TI);
1965 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
1966 return 1;
1967 }
1968 if (esp->ireg & ESP_INTR_FDONE) {
1969 u8 val;
1970
1971 if (esp->rev == FASHME)
1972 val = esp->fifo[0];
1973 else
1974 val = esp_read8(ESP_FDATA);
1975 esp->msg_in[esp->msg_in_len++] = val;
1976
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001977 esp_log_msgin("Got msgin byte %x\n", val);
David S. Millercd9ad582007-04-26 21:19:23 -07001978
1979 if (!esp_msgin_process(esp))
1980 esp->msg_in_len = 0;
1981
1982 if (esp->rev == FASHME)
1983 scsi_esp_cmd(esp, ESP_CMD_FLUSH);
1984
1985 scsi_esp_cmd(esp, ESP_CMD_MOK);
1986
Finn Thainc69edff52017-08-04 01:43:20 -04001987 /* Check whether a bus reset is to be done next */
1988 if (esp->event == ESP_EVENT_RESET)
1989 return 0;
1990
David S. Millercd9ad582007-04-26 21:19:23 -07001991 if (esp->event != ESP_EVENT_FREE_BUS)
1992 esp_event(esp, ESP_EVENT_CHECK_PHASE);
1993 } else {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01001994 shost_printk(KERN_INFO, esp->host,
1995 "MSGIN neither BSERV not FDON, resetting");
David S. Millercd9ad582007-04-26 21:19:23 -07001996 esp_schedule_reset(esp);
1997 return 0;
1998 }
1999 break;
2000 case ESP_EVENT_CMD_START:
2001 memcpy(esp->command_block, esp->cmd_bytes_ptr,
2002 esp->cmd_bytes_left);
Hannes Reinecke31708662014-11-24 15:37:24 +01002003 esp_send_dma_cmd(esp, esp->cmd_bytes_left, 16, ESP_CMD_TI);
David S. Millercd9ad582007-04-26 21:19:23 -07002004 esp_event(esp, ESP_EVENT_CMD_DONE);
2005 esp->flags |= ESP_FLAG_QUICKIRQ_CHECK;
2006 break;
2007 case ESP_EVENT_CMD_DONE:
2008 esp->ops->dma_invalidate(esp);
2009 if (esp->ireg & ESP_INTR_BSERV) {
2010 esp_event(esp, ESP_EVENT_CHECK_PHASE);
2011 goto again;
2012 }
2013 esp_schedule_reset(esp);
2014 return 0;
David S. Millercd9ad582007-04-26 21:19:23 -07002015
2016 case ESP_EVENT_RESET:
2017 scsi_esp_cmd(esp, ESP_CMD_RS);
2018 break;
2019
2020 default:
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002021 shost_printk(KERN_INFO, esp->host,
2022 "Unexpected event %x, resetting\n", esp->event);
David S. Millercd9ad582007-04-26 21:19:23 -07002023 esp_schedule_reset(esp);
2024 return 0;
David S. Millercd9ad582007-04-26 21:19:23 -07002025 }
2026 return 1;
2027}
2028
2029static void esp_reset_cleanup_one(struct esp *esp, struct esp_cmd_entry *ent)
2030{
2031 struct scsi_cmnd *cmd = ent->cmd;
2032
2033 esp_unmap_dma(esp, cmd);
2034 esp_free_lun_tag(ent, cmd->device->hostdata);
2035 cmd->result = DID_RESET << 16;
2036
Christoph Hellwig3f9295b2018-10-13 09:26:27 +02002037 if (ent->flags & ESP_CMD_FLAG_AUTOSENSE)
2038 esp_unmap_sense(esp, ent);
David S. Millercd9ad582007-04-26 21:19:23 -07002039
2040 cmd->scsi_done(cmd);
2041 list_del(&ent->list);
2042 esp_put_ent(esp, ent);
2043}
2044
2045static void esp_clear_hold(struct scsi_device *dev, void *data)
2046{
2047 struct esp_lun_data *lp = dev->hostdata;
2048
2049 BUG_ON(lp->num_tagged);
2050 lp->hold = 0;
2051}
2052
2053static void esp_reset_cleanup(struct esp *esp)
2054{
2055 struct esp_cmd_entry *ent, *tmp;
2056 int i;
2057
2058 list_for_each_entry_safe(ent, tmp, &esp->queued_cmds, list) {
2059 struct scsi_cmnd *cmd = ent->cmd;
2060
2061 list_del(&ent->list);
2062 cmd->result = DID_RESET << 16;
2063 cmd->scsi_done(cmd);
2064 esp_put_ent(esp, ent);
2065 }
2066
2067 list_for_each_entry_safe(ent, tmp, &esp->active_cmds, list) {
2068 if (ent == esp->active_cmd)
2069 esp->active_cmd = NULL;
2070 esp_reset_cleanup_one(esp, ent);
2071 }
2072
2073 BUG_ON(esp->active_cmd != NULL);
2074
2075 /* Force renegotiation of sync/wide transfers. */
2076 for (i = 0; i < ESP_MAX_TARGET; i++) {
2077 struct esp_target_data *tp = &esp->target[i];
2078
2079 tp->esp_period = 0;
2080 tp->esp_offset = 0;
2081 tp->esp_config3 &= ~(ESP_CONFIG3_EWIDE |
2082 ESP_CONFIG3_FSCSI |
2083 ESP_CONFIG3_FAST);
2084 tp->flags &= ~ESP_TGT_WIDE;
2085 tp->flags |= ESP_TGT_CHECK_NEGO;
2086
2087 if (tp->starget)
Maciej W. Rozycki522939d2007-12-10 15:49:31 -08002088 __starget_for_each_device(tp->starget, NULL,
2089 esp_clear_hold);
David S. Millercd9ad582007-04-26 21:19:23 -07002090 }
Thomas Bogendoerfer204abf22007-06-13 12:58:53 -07002091 esp->flags &= ~ESP_FLAG_RESETTING;
David S. Millercd9ad582007-04-26 21:19:23 -07002092}
2093
2094/* Runs under host->lock */
2095static void __esp_interrupt(struct esp *esp)
2096{
2097 int finish_reset, intr_done;
2098 u8 phase;
2099
Hannes Reinecke9535fff2014-11-24 15:37:23 +01002100 /*
2101 * Once INTRPT is read STATUS and SSTEP are cleared.
2102 */
David S. Millercd9ad582007-04-26 21:19:23 -07002103 esp->sreg = esp_read8(ESP_STATUS);
Hannes Reinecke9535fff2014-11-24 15:37:23 +01002104 esp->seqreg = esp_read8(ESP_SSTEP);
2105 esp->ireg = esp_read8(ESP_INTRPT);
David S. Millercd9ad582007-04-26 21:19:23 -07002106
2107 if (esp->flags & ESP_FLAG_RESETTING) {
2108 finish_reset = 1;
2109 } else {
2110 if (esp_check_gross_error(esp))
2111 return;
2112
2113 finish_reset = esp_check_spur_intr(esp);
2114 if (finish_reset < 0)
2115 return;
2116 }
2117
David S. Millercd9ad582007-04-26 21:19:23 -07002118 if (esp->ireg & ESP_INTR_SR)
2119 finish_reset = 1;
2120
2121 if (finish_reset) {
2122 esp_reset_cleanup(esp);
2123 if (esp->eh_reset) {
2124 complete(esp->eh_reset);
2125 esp->eh_reset = NULL;
2126 }
2127 return;
2128 }
2129
2130 phase = (esp->sreg & ESP_STAT_PMASK);
2131 if (esp->rev == FASHME) {
2132 if (((phase != ESP_DIP && phase != ESP_DOP) &&
2133 esp->select_state == ESP_SELECT_NONE &&
2134 esp->event != ESP_EVENT_STATUS &&
2135 esp->event != ESP_EVENT_DATA_DONE) ||
2136 (esp->ireg & ESP_INTR_RSEL)) {
2137 esp->sreg2 = esp_read8(ESP_STATUS2);
2138 if (!(esp->sreg2 & ESP_STAT2_FEMPTY) ||
2139 (esp->sreg2 & ESP_STAT2_F1BYTE))
2140 hme_read_fifo(esp);
2141 }
2142 }
2143
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002144 esp_log_intr("intr sreg[%02x] seqreg[%02x] "
David S. Millercd9ad582007-04-26 21:19:23 -07002145 "sreg2[%02x] ireg[%02x]\n",
2146 esp->sreg, esp->seqreg, esp->sreg2, esp->ireg);
2147
2148 intr_done = 0;
2149
2150 if (esp->ireg & (ESP_INTR_S | ESP_INTR_SATN | ESP_INTR_IC)) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002151 shost_printk(KERN_INFO, esp->host,
2152 "unexpected IREG %02x\n", esp->ireg);
David S. Millercd9ad582007-04-26 21:19:23 -07002153 if (esp->ireg & ESP_INTR_IC)
2154 esp_dump_cmd_log(esp);
2155
2156 esp_schedule_reset(esp);
2157 } else {
Finn Thain201c37d2017-08-04 01:43:19 -04002158 if (esp->ireg & ESP_INTR_RSEL) {
David S. Millercd9ad582007-04-26 21:19:23 -07002159 if (esp->active_cmd)
2160 (void) esp_finish_select(esp);
2161 intr_done = esp_reconnect(esp);
Finn Thain201c37d2017-08-04 01:43:19 -04002162 } else {
2163 /* Some combination of FDONE, BSERV, DC. */
2164 if (esp->select_state != ESP_SELECT_NONE)
2165 intr_done = esp_finish_select(esp);
David S. Millercd9ad582007-04-26 21:19:23 -07002166 }
2167 }
2168 while (!intr_done)
2169 intr_done = esp_process_event(esp);
2170}
2171
2172irqreturn_t scsi_esp_intr(int irq, void *dev_id)
2173{
2174 struct esp *esp = dev_id;
2175 unsigned long flags;
2176 irqreturn_t ret;
2177
2178 spin_lock_irqsave(esp->host->host_lock, flags);
2179 ret = IRQ_NONE;
2180 if (esp->ops->irq_pending(esp)) {
2181 ret = IRQ_HANDLED;
2182 for (;;) {
2183 int i;
2184
2185 __esp_interrupt(esp);
2186 if (!(esp->flags & ESP_FLAG_QUICKIRQ_CHECK))
2187 break;
2188 esp->flags &= ~ESP_FLAG_QUICKIRQ_CHECK;
2189
2190 for (i = 0; i < ESP_QUICKIRQ_LIMIT; i++) {
2191 if (esp->ops->irq_pending(esp))
2192 break;
2193 }
2194 if (i == ESP_QUICKIRQ_LIMIT)
2195 break;
2196 }
2197 }
2198 spin_unlock_irqrestore(esp->host->host_lock, flags);
2199
2200 return ret;
2201}
2202EXPORT_SYMBOL(scsi_esp_intr);
2203
Adrian Bunk76246802007-10-11 17:35:20 +02002204static void esp_get_revision(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002205{
2206 u8 val;
2207
2208 esp->config1 = (ESP_CONFIG1_PENABLE | (esp->scsi_id & 7));
Paolo Bonzini8a9aeb42014-11-24 15:37:28 +01002209 if (esp->config2 == 0) {
2210 esp->config2 = (ESP_CONFIG2_SCSI2ENAB | ESP_CONFIG2_REGPARITY);
David S. Millercd9ad582007-04-26 21:19:23 -07002211 esp_write8(esp->config2, ESP_CFG2);
Paolo Bonzini8a9aeb42014-11-24 15:37:28 +01002212
2213 val = esp_read8(ESP_CFG2);
2214 val &= ~ESP_CONFIG2_MAGIC;
2215
2216 esp->config2 = 0;
2217 if (val != (ESP_CONFIG2_SCSI2ENAB | ESP_CONFIG2_REGPARITY)) {
2218 /*
2219 * If what we write to cfg2 does not come back,
2220 * cfg2 is not implemented.
2221 * Therefore this must be a plain esp100.
2222 */
2223 esp->rev = ESP100;
2224 return;
2225 }
2226 }
2227
2228 esp_set_all_config3(esp, 5);
2229 esp->prev_cfg3 = 5;
2230 esp_write8(esp->config2, ESP_CFG2);
2231 esp_write8(0, ESP_CFG3);
2232 esp_write8(esp->prev_cfg3, ESP_CFG3);
2233
2234 val = esp_read8(ESP_CFG3);
2235 if (val != 5) {
2236 /* The cfg2 register is implemented, however
2237 * cfg3 is not, must be esp100a.
2238 */
2239 esp->rev = ESP100A;
2240 } else {
2241 esp_set_all_config3(esp, 0);
2242 esp->prev_cfg3 = 0;
David S. Millercd9ad582007-04-26 21:19:23 -07002243 esp_write8(esp->prev_cfg3, ESP_CFG3);
2244
Paolo Bonzini8a9aeb42014-11-24 15:37:28 +01002245 /* All of cfg{1,2,3} implemented, must be one of
2246 * the fas variants, figure out which one.
2247 */
2248 if (esp->cfact == 0 || esp->cfact > ESP_CCF_F5) {
2249 esp->rev = FAST;
2250 esp->sync_defp = SYNC_DEFP_FAST;
David S. Millercd9ad582007-04-26 21:19:23 -07002251 } else {
Paolo Bonzini8a9aeb42014-11-24 15:37:28 +01002252 esp->rev = ESP236;
David S. Millercd9ad582007-04-26 21:19:23 -07002253 }
2254 }
2255}
2256
Adrian Bunk76246802007-10-11 17:35:20 +02002257static void esp_init_swstate(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002258{
2259 int i;
2260
2261 INIT_LIST_HEAD(&esp->queued_cmds);
2262 INIT_LIST_HEAD(&esp->active_cmds);
2263 INIT_LIST_HEAD(&esp->esp_cmd_pool);
2264
2265 /* Start with a clear state, domain validation (via ->slave_configure,
2266 * spi_dv_device()) will attempt to enable SYNC, WIDE, and tagged
2267 * commands.
2268 */
2269 for (i = 0 ; i < ESP_MAX_TARGET; i++) {
2270 esp->target[i].flags = 0;
2271 esp->target[i].nego_goal_period = 0;
2272 esp->target[i].nego_goal_offset = 0;
2273 esp->target[i].nego_goal_width = 0;
2274 esp->target[i].nego_goal_tags = 0;
2275 }
2276}
2277
2278/* This places the ESP into a known state at boot time. */
Martin Habetsd679f802007-05-07 14:05:03 -07002279static void esp_bootup_reset(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002280{
2281 u8 val;
2282
2283 /* Reset the DMA */
2284 esp->ops->reset_dma(esp);
2285
2286 /* Reset the ESP */
2287 esp_reset_esp(esp);
2288
2289 /* Reset the SCSI bus, but tell ESP not to generate an irq */
2290 val = esp_read8(ESP_CFG1);
2291 val |= ESP_CONFIG1_SRRDISAB;
2292 esp_write8(val, ESP_CFG1);
2293
2294 scsi_esp_cmd(esp, ESP_CMD_RS);
2295 udelay(400);
2296
2297 esp_write8(esp->config1, ESP_CFG1);
2298
2299 /* Eat any bitrot in the chip and we are done... */
2300 esp_read8(ESP_INTRPT);
2301}
2302
Adrian Bunk76246802007-10-11 17:35:20 +02002303static void esp_set_clock_params(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002304{
Finn Thain6fe07aa2008-04-25 10:06:05 -05002305 int fhz;
David S. Millercd9ad582007-04-26 21:19:23 -07002306 u8 ccf;
2307
2308 /* This is getting messy but it has to be done correctly or else
2309 * you get weird behavior all over the place. We are trying to
2310 * basically figure out three pieces of information.
2311 *
2312 * a) Clock Conversion Factor
2313 *
2314 * This is a representation of the input crystal clock frequency
2315 * going into the ESP on this machine. Any operation whose timing
2316 * is longer than 400ns depends on this value being correct. For
2317 * example, you'll get blips for arbitration/selection during high
2318 * load or with multiple targets if this is not set correctly.
2319 *
2320 * b) Selection Time-Out
2321 *
2322 * The ESP isn't very bright and will arbitrate for the bus and try
2323 * to select a target forever if you let it. This value tells the
2324 * ESP when it has taken too long to negotiate and that it should
2325 * interrupt the CPU so we can see what happened. The value is
2326 * computed as follows (from NCR/Symbios chip docs).
2327 *
2328 * (Time Out Period) * (Input Clock)
2329 * STO = ----------------------------------
2330 * (8192) * (Clock Conversion Factor)
2331 *
2332 * We use a time out period of 250ms (ESP_BUS_TIMEOUT).
2333 *
2334 * c) Imperical constants for synchronous offset and transfer period
2335 * register values
2336 *
2337 * This entails the smallest and largest sync period we could ever
2338 * handle on this ESP.
2339 */
Finn Thain6fe07aa2008-04-25 10:06:05 -05002340 fhz = esp->cfreq;
David S. Millercd9ad582007-04-26 21:19:23 -07002341
Finn Thain6fe07aa2008-04-25 10:06:05 -05002342 ccf = ((fhz / 1000000) + 4) / 5;
David S. Millercd9ad582007-04-26 21:19:23 -07002343 if (ccf == 1)
2344 ccf = 2;
2345
2346 /* If we can't find anything reasonable, just assume 20MHZ.
2347 * This is the clock frequency of the older sun4c's where I've
2348 * been unable to find the clock-frequency PROM property. All
2349 * other machines provide useful values it seems.
2350 */
Finn Thain6fe07aa2008-04-25 10:06:05 -05002351 if (fhz <= 5000000 || ccf < 1 || ccf > 8) {
2352 fhz = 20000000;
David S. Millercd9ad582007-04-26 21:19:23 -07002353 ccf = 4;
2354 }
2355
2356 esp->cfact = (ccf == 8 ? 0 : ccf);
Finn Thain6fe07aa2008-04-25 10:06:05 -05002357 esp->cfreq = fhz;
2358 esp->ccycle = ESP_HZ_TO_CYCLE(fhz);
David S. Millercd9ad582007-04-26 21:19:23 -07002359 esp->ctick = ESP_TICK(ccf, esp->ccycle);
Finn Thain6fe07aa2008-04-25 10:06:05 -05002360 esp->neg_defp = ESP_NEG_DEFP(fhz, ccf);
David S. Millercd9ad582007-04-26 21:19:23 -07002361 esp->sync_defp = SYNC_DEFP_SLOW;
2362}
2363
2364static const char *esp_chip_names[] = {
2365 "ESP100",
2366 "ESP100A",
2367 "ESP236",
2368 "FAS236",
2369 "FAS100A",
2370 "FAST",
2371 "FASHME",
Hannes Reineckeeeea2f92014-11-24 15:37:27 +01002372 "AM53C974",
David S. Millercd9ad582007-04-26 21:19:23 -07002373};
2374
2375static struct scsi_transport_template *esp_transport_template;
2376
Christoph Hellwig44b1b4d2018-10-13 09:26:26 +02002377int scsi_esp_register(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002378{
2379 static int instance;
2380 int err;
2381
Hannes Reinecke3707a182014-11-24 15:37:20 +01002382 if (!esp->num_tags)
2383 esp->num_tags = ESP_DEFAULT_TAGS;
David S. Millercd9ad582007-04-26 21:19:23 -07002384 esp->host->transportt = esp_transport_template;
2385 esp->host->max_lun = ESP_MAX_LUN;
2386 esp->host->cmd_per_lun = 2;
David Millerff4abd62007-08-24 22:25:58 -07002387 esp->host->unique_id = instance;
David S. Millercd9ad582007-04-26 21:19:23 -07002388
2389 esp_set_clock_params(esp);
2390
2391 esp_get_revision(esp);
2392
2393 esp_init_swstate(esp);
2394
2395 esp_bootup_reset(esp);
2396
Christoph Hellwig44b1b4d2018-10-13 09:26:26 +02002397 dev_printk(KERN_INFO, esp->dev, "esp%u: regs[%1p:%1p] irq[%u]\n",
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002398 esp->host->unique_id, esp->regs, esp->dma_regs,
2399 esp->host->irq);
Christoph Hellwig44b1b4d2018-10-13 09:26:26 +02002400 dev_printk(KERN_INFO, esp->dev,
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002401 "esp%u: is a %s, %u MHz (ccf=%u), SCSI ID %u\n",
2402 esp->host->unique_id, esp_chip_names[esp->rev],
2403 esp->cfreq / 1000000, esp->cfact, esp->scsi_id);
David S. Millercd9ad582007-04-26 21:19:23 -07002404
2405 /* Let the SCSI bus reset settle. */
2406 ssleep(esp_bus_reset_settle);
2407
Christoph Hellwig44b1b4d2018-10-13 09:26:26 +02002408 err = scsi_add_host(esp->host, esp->dev);
David S. Millercd9ad582007-04-26 21:19:23 -07002409 if (err)
2410 return err;
2411
David Millerff4abd62007-08-24 22:25:58 -07002412 instance++;
David S. Millercd9ad582007-04-26 21:19:23 -07002413
2414 scsi_scan_host(esp->host);
2415
2416 return 0;
2417}
2418EXPORT_SYMBOL(scsi_esp_register);
2419
Adrian Bunk76246802007-10-11 17:35:20 +02002420void scsi_esp_unregister(struct esp *esp)
David S. Millercd9ad582007-04-26 21:19:23 -07002421{
2422 scsi_remove_host(esp->host);
2423}
2424EXPORT_SYMBOL(scsi_esp_unregister);
2425
James Bottomleyec5e69f2008-06-23 14:52:09 -05002426static int esp_target_alloc(struct scsi_target *starget)
2427{
2428 struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
2429 struct esp_target_data *tp = &esp->target[starget->id];
2430
2431 tp->starget = starget;
2432
2433 return 0;
2434}
2435
2436static void esp_target_destroy(struct scsi_target *starget)
2437{
2438 struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
2439 struct esp_target_data *tp = &esp->target[starget->id];
2440
2441 tp->starget = NULL;
2442}
2443
David S. Millercd9ad582007-04-26 21:19:23 -07002444static int esp_slave_alloc(struct scsi_device *dev)
2445{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002446 struct esp *esp = shost_priv(dev->host);
David S. Millercd9ad582007-04-26 21:19:23 -07002447 struct esp_target_data *tp = &esp->target[dev->id];
2448 struct esp_lun_data *lp;
2449
2450 lp = kzalloc(sizeof(*lp), GFP_KERNEL);
2451 if (!lp)
2452 return -ENOMEM;
2453 dev->hostdata = lp;
2454
David S. Millercd9ad582007-04-26 21:19:23 -07002455 spi_min_period(tp->starget) = esp->min_period;
2456 spi_max_offset(tp->starget) = 15;
2457
2458 if (esp->flags & ESP_FLAG_WIDE_CAPABLE)
2459 spi_max_width(tp->starget) = 1;
2460 else
2461 spi_max_width(tp->starget) = 0;
2462
2463 return 0;
2464}
2465
2466static int esp_slave_configure(struct scsi_device *dev)
2467{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002468 struct esp *esp = shost_priv(dev->host);
David S. Millercd9ad582007-04-26 21:19:23 -07002469 struct esp_target_data *tp = &esp->target[dev->id];
David S. Millercd9ad582007-04-26 21:19:23 -07002470
Hannes Reinecke3707a182014-11-24 15:37:20 +01002471 if (dev->tagged_supported)
2472 scsi_change_queue_depth(dev, esp->num_tags);
David S. Millercd9ad582007-04-26 21:19:23 -07002473
David S. Millercd9ad582007-04-26 21:19:23 -07002474 tp->flags |= ESP_TGT_DISCONNECT;
2475
2476 if (!spi_initial_dv(dev->sdev_target))
2477 spi_dv_device(dev);
2478
2479 return 0;
2480}
2481
2482static void esp_slave_destroy(struct scsi_device *dev)
2483{
2484 struct esp_lun_data *lp = dev->hostdata;
2485
2486 kfree(lp);
2487 dev->hostdata = NULL;
2488}
2489
2490static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
2491{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002492 struct esp *esp = shost_priv(cmd->device->host);
David S. Millercd9ad582007-04-26 21:19:23 -07002493 struct esp_cmd_entry *ent, *tmp;
2494 struct completion eh_done;
2495 unsigned long flags;
2496
2497 /* XXX This helps a lot with debugging but might be a bit
2498 * XXX much for the final driver.
2499 */
2500 spin_lock_irqsave(esp->host->host_lock, flags);
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002501 shost_printk(KERN_ERR, esp->host, "Aborting command [%p:%02x]\n",
2502 cmd, cmd->cmnd[0]);
David S. Millercd9ad582007-04-26 21:19:23 -07002503 ent = esp->active_cmd;
2504 if (ent)
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002505 shost_printk(KERN_ERR, esp->host,
2506 "Current command [%p:%02x]\n",
2507 ent->cmd, ent->cmd->cmnd[0]);
David S. Millercd9ad582007-04-26 21:19:23 -07002508 list_for_each_entry(ent, &esp->queued_cmds, list) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002509 shost_printk(KERN_ERR, esp->host, "Queued command [%p:%02x]\n",
2510 ent->cmd, ent->cmd->cmnd[0]);
David S. Millercd9ad582007-04-26 21:19:23 -07002511 }
2512 list_for_each_entry(ent, &esp->active_cmds, list) {
Hannes Reineckea1a75b32014-11-24 15:37:21 +01002513 shost_printk(KERN_ERR, esp->host, " Active command [%p:%02x]\n",
2514 ent->cmd, ent->cmd->cmnd[0]);
David S. Millercd9ad582007-04-26 21:19:23 -07002515 }
2516 esp_dump_cmd_log(esp);
2517 spin_unlock_irqrestore(esp->host->host_lock, flags);
2518
2519 spin_lock_irqsave(esp->host->host_lock, flags);
2520
2521 ent = NULL;
2522 list_for_each_entry(tmp, &esp->queued_cmds, list) {
2523 if (tmp->cmd == cmd) {
2524 ent = tmp;
2525 break;
2526 }
2527 }
2528
2529 if (ent) {
2530 /* Easiest case, we didn't even issue the command
2531 * yet so it is trivial to abort.
2532 */
2533 list_del(&ent->list);
2534
2535 cmd->result = DID_ABORT << 16;
2536 cmd->scsi_done(cmd);
2537
2538 esp_put_ent(esp, ent);
2539
2540 goto out_success;
2541 }
2542
2543 init_completion(&eh_done);
2544
2545 ent = esp->active_cmd;
2546 if (ent && ent->cmd == cmd) {
2547 /* Command is the currently active command on
2548 * the bus. If we already have an output message
2549 * pending, no dice.
2550 */
2551 if (esp->msg_out_len)
2552 goto out_failure;
2553
2554 /* Send out an abort, encouraging the target to
2555 * go to MSGOUT phase by asserting ATN.
2556 */
2557 esp->msg_out[0] = ABORT_TASK_SET;
2558 esp->msg_out_len = 1;
2559 ent->eh_done = &eh_done;
2560
2561 scsi_esp_cmd(esp, ESP_CMD_SATN);
2562 } else {
2563 /* The command is disconnected. This is not easy to
2564 * abort. For now we fail and let the scsi error
2565 * handling layer go try a scsi bus reset or host
2566 * reset.
2567 *
2568 * What we could do is put together a scsi command
2569 * solely for the purpose of sending an abort message
2570 * to the target. Coming up with all the code to
2571 * cook up scsi commands, special case them everywhere,
2572 * etc. is for questionable gain and it would be better
2573 * if the generic scsi error handling layer could do at
2574 * least some of that for us.
2575 *
2576 * Anyways this is an area for potential future improvement
2577 * in this driver.
2578 */
2579 goto out_failure;
2580 }
2581
2582 spin_unlock_irqrestore(esp->host->host_lock, flags);
2583
2584 if (!wait_for_completion_timeout(&eh_done, 5 * HZ)) {
2585 spin_lock_irqsave(esp->host->host_lock, flags);
2586 ent->eh_done = NULL;
2587 spin_unlock_irqrestore(esp->host->host_lock, flags);
2588
2589 return FAILED;
2590 }
2591
2592 return SUCCESS;
2593
2594out_success:
2595 spin_unlock_irqrestore(esp->host->host_lock, flags);
2596 return SUCCESS;
2597
2598out_failure:
2599 /* XXX This might be a good location to set ESP_TGT_BROKEN
2600 * XXX since we know which target/lun in particular is
2601 * XXX causing trouble.
2602 */
2603 spin_unlock_irqrestore(esp->host->host_lock, flags);
2604 return FAILED;
2605}
2606
2607static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd)
2608{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002609 struct esp *esp = shost_priv(cmd->device->host);
David S. Millercd9ad582007-04-26 21:19:23 -07002610 struct completion eh_reset;
2611 unsigned long flags;
2612
2613 init_completion(&eh_reset);
2614
2615 spin_lock_irqsave(esp->host->host_lock, flags);
2616
2617 esp->eh_reset = &eh_reset;
2618
2619 /* XXX This is too simple... We should add lots of
2620 * XXX checks here so that if we find that the chip is
2621 * XXX very wedged we return failure immediately so
2622 * XXX that we can perform a full chip reset.
2623 */
2624 esp->flags |= ESP_FLAG_RESETTING;
2625 scsi_esp_cmd(esp, ESP_CMD_RS);
2626
2627 spin_unlock_irqrestore(esp->host->host_lock, flags);
2628
2629 ssleep(esp_bus_reset_settle);
2630
2631 if (!wait_for_completion_timeout(&eh_reset, 5 * HZ)) {
2632 spin_lock_irqsave(esp->host->host_lock, flags);
2633 esp->eh_reset = NULL;
2634 spin_unlock_irqrestore(esp->host->host_lock, flags);
2635
2636 return FAILED;
2637 }
2638
2639 return SUCCESS;
2640}
2641
2642/* All bets are off, reset the entire device. */
2643static int esp_eh_host_reset_handler(struct scsi_cmnd *cmd)
2644{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002645 struct esp *esp = shost_priv(cmd->device->host);
David S. Millercd9ad582007-04-26 21:19:23 -07002646 unsigned long flags;
2647
2648 spin_lock_irqsave(esp->host->host_lock, flags);
2649 esp_bootup_reset(esp);
2650 esp_reset_cleanup(esp);
2651 spin_unlock_irqrestore(esp->host->host_lock, flags);
2652
2653 ssleep(esp_bus_reset_settle);
2654
2655 return SUCCESS;
2656}
2657
2658static const char *esp_info(struct Scsi_Host *host)
2659{
2660 return "esp";
2661}
2662
2663struct scsi_host_template scsi_esp_template = {
2664 .module = THIS_MODULE,
2665 .name = "esp",
2666 .info = esp_info,
2667 .queuecommand = esp_queuecommand,
James Bottomleyec5e69f2008-06-23 14:52:09 -05002668 .target_alloc = esp_target_alloc,
2669 .target_destroy = esp_target_destroy,
David S. Millercd9ad582007-04-26 21:19:23 -07002670 .slave_alloc = esp_slave_alloc,
2671 .slave_configure = esp_slave_configure,
2672 .slave_destroy = esp_slave_destroy,
2673 .eh_abort_handler = esp_eh_abort_handler,
2674 .eh_bus_reset_handler = esp_eh_bus_reset_handler,
2675 .eh_host_reset_handler = esp_eh_host_reset_handler,
2676 .can_queue = 7,
2677 .this_id = 7,
2678 .sg_tablesize = SG_ALL,
2679 .use_clustering = ENABLE_CLUSTERING,
2680 .max_sectors = 0xffff,
2681 .skip_settle_delay = 1,
2682};
2683EXPORT_SYMBOL(scsi_esp_template);
2684
2685static void esp_get_signalling(struct Scsi_Host *host)
2686{
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002687 struct esp *esp = shost_priv(host);
David S. Millercd9ad582007-04-26 21:19:23 -07002688 enum spi_signal_type type;
2689
2690 if (esp->flags & ESP_FLAG_DIFFERENTIAL)
2691 type = SPI_SIGNAL_HVD;
2692 else
2693 type = SPI_SIGNAL_SE;
2694
2695 spi_signalling(host) = type;
2696}
2697
2698static void esp_set_offset(struct scsi_target *target, int offset)
2699{
2700 struct Scsi_Host *host = dev_to_shost(target->dev.parent);
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002701 struct esp *esp = shost_priv(host);
David S. Millercd9ad582007-04-26 21:19:23 -07002702 struct esp_target_data *tp = &esp->target[target->id];
2703
Finn Thain02507a82009-12-05 12:30:42 +11002704 if (esp->flags & ESP_FLAG_DISABLE_SYNC)
2705 tp->nego_goal_offset = 0;
2706 else
2707 tp->nego_goal_offset = offset;
David S. Millercd9ad582007-04-26 21:19:23 -07002708 tp->flags |= ESP_TGT_CHECK_NEGO;
2709}
2710
2711static void esp_set_period(struct scsi_target *target, int period)
2712{
2713 struct Scsi_Host *host = dev_to_shost(target->dev.parent);
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002714 struct esp *esp = shost_priv(host);
David S. Millercd9ad582007-04-26 21:19:23 -07002715 struct esp_target_data *tp = &esp->target[target->id];
2716
2717 tp->nego_goal_period = period;
2718 tp->flags |= ESP_TGT_CHECK_NEGO;
2719}
2720
2721static void esp_set_width(struct scsi_target *target, int width)
2722{
2723 struct Scsi_Host *host = dev_to_shost(target->dev.parent);
Christoph Hellwig2b14ec72007-05-31 20:12:32 +02002724 struct esp *esp = shost_priv(host);
David S. Millercd9ad582007-04-26 21:19:23 -07002725 struct esp_target_data *tp = &esp->target[target->id];
2726
2727 tp->nego_goal_width = (width ? 1 : 0);
2728 tp->flags |= ESP_TGT_CHECK_NEGO;
2729}
2730
2731static struct spi_function_template esp_transport_ops = {
2732 .set_offset = esp_set_offset,
2733 .show_offset = 1,
2734 .set_period = esp_set_period,
2735 .show_period = 1,
2736 .set_width = esp_set_width,
2737 .show_width = 1,
2738 .get_signalling = esp_get_signalling,
2739};
2740
2741static int __init esp_init(void)
2742{
2743 BUILD_BUG_ON(sizeof(struct scsi_pointer) <
2744 sizeof(struct esp_cmd_priv));
2745
2746 esp_transport_template = spi_attach_transport(&esp_transport_ops);
2747 if (!esp_transport_template)
2748 return -ENODEV;
2749
2750 return 0;
2751}
2752
2753static void __exit esp_exit(void)
2754{
2755 spi_release_transport(esp_transport_template);
2756}
2757
2758MODULE_DESCRIPTION("ESP SCSI driver core");
2759MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
2760MODULE_LICENSE("GPL");
2761MODULE_VERSION(DRV_VERSION);
2762
2763module_param(esp_bus_reset_settle, int, 0);
2764MODULE_PARM_DESC(esp_bus_reset_settle,
2765 "ESP scsi bus reset delay in seconds");
2766
2767module_param(esp_debug, int, 0);
2768MODULE_PARM_DESC(esp_debug,
2769"ESP bitmapped debugging message enable value:\n"
2770" 0x00000001 Log interrupt events\n"
2771" 0x00000002 Log scsi commands\n"
2772" 0x00000004 Log resets\n"
2773" 0x00000008 Log message in events\n"
2774" 0x00000010 Log message out events\n"
2775" 0x00000020 Log command completion\n"
2776" 0x00000040 Log disconnects\n"
2777" 0x00000080 Log data start\n"
2778" 0x00000100 Log data done\n"
2779" 0x00000200 Log reconnects\n"
2780" 0x00000400 Log auto-sense data\n"
2781);
2782
2783module_init(esp_init);
2784module_exit(esp_exit);