Linux-2.6.12-rc2
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / scsi / pcmcia / nsp_cs.c
1 /*======================================================================
2
3 NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver
4 By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
5
6 Ver.2.8 Support 32bit MMIO mode
7 Support Synchronous Data Transfer Request (SDTR) mode
8 Ver.2.0 Support 32bit PIO mode
9 Ver.1.1.2 Fix for scatter list buffer exceeds
10 Ver.1.1 Support scatter list
11 Ver.0.1 Initial version
12
13 This software may be used and distributed according to the terms of
14 the GNU General Public License.
15
16 ======================================================================*/
17
18 /***********************************************************************
19 This driver is for these PCcards.
20
21 I-O DATA PCSC-F (Workbit NinjaSCSI-3)
22 "WBT", "NinjaSCSI-3", "R1.0"
23 I-O DATA CBSC-II (Workbit NinjaSCSI-32Bi in 16bit mode)
24 "IO DATA", "CBSC16 ", "1"
25
26 ***********************************************************************/
27
28 /* $Id: nsp_cs.c,v 1.23 2003/08/18 11:09:19 elca Exp $ */
29
30 #include <linux/version.h>
31 #include <linux/module.h>
32 #include <linux/kernel.h>
33 #include <linux/init.h>
34 #include <linux/sched.h>
35 #include <linux/slab.h>
36 #include <linux/string.h>
37 #include <linux/timer.h>
38 #include <linux/ioport.h>
39 #include <linux/delay.h>
40 #include <linux/interrupt.h>
41 #include <linux/major.h>
42 #include <linux/blkdev.h>
43 #include <linux/stat.h>
44
45 #include <asm/io.h>
46 #include <asm/irq.h>
47
48 #include <../drivers/scsi/scsi.h>
49 #include <scsi/scsi_host.h>
50
51 #include <scsi/scsi.h>
52 #include <scsi/scsi_ioctl.h>
53
54 #include <pcmcia/version.h>
55 #include <pcmcia/cs_types.h>
56 #include <pcmcia/cs.h>
57 #include <pcmcia/cistpl.h>
58 #include <pcmcia/cisreg.h>
59 #include <pcmcia/ds.h>
60
61 #include "nsp_cs.h"
62
63 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
64 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.23 $");
65 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
66 #ifdef MODULE_LICENSE
67 MODULE_LICENSE("GPL");
68 #endif
69
70 #include "nsp_io.h"
71
72 /*====================================================================*/
73 /* Parameters that can be set with 'insmod' */
74
75 static int nsp_burst_mode = BURST_MEM32;
76 module_param(nsp_burst_mode, int, 0);
77 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
78
79 /* Release IO ports after configuration? */
80 static int free_ports = 0;
81 module_param(free_ports, bool, 0);
82 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
83
84 /* /usr/src/linux/drivers/scsi/hosts.h */
85 static Scsi_Host_Template nsp_driver_template = {
86 .proc_name = "nsp_cs",
87 .proc_info = nsp_proc_info,
88 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)",
89 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
90 .detect = nsp_detect_old,
91 .release = nsp_release_old,
92 #endif
93 .info = nsp_info,
94 .queuecommand = nsp_queuecommand,
95 /* .eh_strategy_handler = nsp_eh_strategy,*/
96 /* .eh_abort_handler = nsp_eh_abort,*/
97 /* .eh_device_reset_handler = nsp_eh_device_reset,*/
98 .eh_bus_reset_handler = nsp_eh_bus_reset,
99 .eh_host_reset_handler = nsp_eh_host_reset,
100 .can_queue = 1,
101 .this_id = NSP_INITIATOR_ID,
102 .sg_tablesize = SG_ALL,
103 .cmd_per_lun = 1,
104 .use_clustering = DISABLE_CLUSTERING,
105 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2))
106 .use_new_eh_code = 1,
107 #endif
108 };
109
110 static dev_link_t *dev_list = NULL;
111 static dev_info_t dev_info = {"nsp_cs"};
112
113 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
114
115
116
117 /*
118 * debug, error print
119 */
120 #ifndef NSP_DEBUG
121 # define NSP_DEBUG_MASK 0x000000
122 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
123 # define nsp_dbg(mask, args...) /* */
124 #else
125 # define NSP_DEBUG_MASK 0xffffff
126 # define nsp_msg(type, args...) \
127 nsp_cs_message (__FUNCTION__, __LINE__, (type), args)
128 # define nsp_dbg(mask, args...) \
129 nsp_cs_dmessage(__FUNCTION__, __LINE__, (mask), args)
130 #endif
131
132 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
133 #define NSP_DEBUG_REGISTER BIT(1)
134 #define NSP_DEBUG_AUTOSCSI BIT(2)
135 #define NSP_DEBUG_INTR BIT(3)
136 #define NSP_DEBUG_SGLIST BIT(4)
137 #define NSP_DEBUG_BUSFREE BIT(5)
138 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
139 #define NSP_DEBUG_RESELECTION BIT(7)
140 #define NSP_DEBUG_MSGINOCCUR BIT(8)
141 #define NSP_DEBUG_EEPROM BIT(9)
142 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
143 #define NSP_DEBUG_BUSRESET BIT(11)
144 #define NSP_DEBUG_RESTART BIT(12)
145 #define NSP_DEBUG_SYNC BIT(13)
146 #define NSP_DEBUG_WAIT BIT(14)
147 #define NSP_DEBUG_TARGETFLAG BIT(15)
148 #define NSP_DEBUG_PROC BIT(16)
149 #define NSP_DEBUG_INIT BIT(17)
150 #define NSP_DEBUG_DATA_IO BIT(18)
151 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
152
153 #define NSP_DEBUG_BUF_LEN 150
154
155 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
156 {
157 va_list args;
158 char buf[NSP_DEBUG_BUF_LEN];
159
160 va_start(args, fmt);
161 vsnprintf(buf, sizeof(buf), fmt, args);
162 va_end(args);
163
164 #ifndef NSP_DEBUG
165 printk("%snsp_cs: %s\n", type, buf);
166 #else
167 printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
168 #endif
169 }
170
171 #ifdef NSP_DEBUG
172 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
173 {
174 va_list args;
175 char buf[NSP_DEBUG_BUF_LEN];
176
177 va_start(args, fmt);
178 vsnprintf(buf, sizeof(buf), fmt, args);
179 va_end(args);
180
181 if (mask & NSP_DEBUG_MASK) {
182 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
183 }
184 }
185 #endif
186
187 /***********************************************************/
188
189 /*====================================================
190 * Clenaup parameters and call done() functions.
191 * You must be set SCpnt->result before call this function.
192 */
193 static void nsp_scsi_done(Scsi_Cmnd *SCpnt)
194 {
195 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
196
197 data->CurrentSC = NULL;
198
199 SCpnt->scsi_done(SCpnt);
200 }
201
202 static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
203 {
204 #ifdef NSP_DEBUG
205 /*unsigned int host_id = SCpnt->device->host->this_id;*/
206 /*unsigned int base = SCpnt->device->host->io_port;*/
207 unsigned char target = SCpnt->device->id;
208 #endif
209 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
210
211 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d",
212 SCpnt, target, SCpnt->device->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg);
213 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
214
215 SCpnt->scsi_done = done;
216
217 if (data->CurrentSC != NULL) {
218 nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
219 SCpnt->result = DID_BAD_TARGET << 16;
220 nsp_scsi_done(SCpnt);
221 return 0;
222 }
223
224 #if 0
225 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
226 This makes kernel crash when suspending... */
227 if (data->ScsiInfo->stop != 0) {
228 nsp_msg(KERN_INFO, "suspending device. reject command.");
229 SCpnt->result = DID_BAD_TARGET << 16;
230 nsp_scsi_done(SCpnt);
231 return SCSI_MLQUEUE_HOST_BUSY;
232 }
233 #endif
234
235 show_command(SCpnt);
236
237 data->CurrentSC = SCpnt;
238
239 SCpnt->SCp.Status = CHECK_CONDITION;
240 SCpnt->SCp.Message = 0;
241 SCpnt->SCp.have_data_in = IO_UNKNOWN;
242 SCpnt->SCp.sent_command = 0;
243 SCpnt->SCp.phase = PH_UNDETERMINED;
244 SCpnt->resid = SCpnt->request_bufflen;
245
246 /* setup scratch area
247 SCp.ptr : buffer pointer
248 SCp.this_residual : buffer length
249 SCp.buffer : next buffer
250 SCp.buffers_residual : left buffers in list
251 SCp.phase : current state of the command */
252 if (SCpnt->use_sg) {
253 SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
254 SCpnt->SCp.ptr = BUFFER_ADDR;
255 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
256 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
257 } else {
258 SCpnt->SCp.ptr = (char *) SCpnt->request_buffer;
259 SCpnt->SCp.this_residual = SCpnt->request_bufflen;
260 SCpnt->SCp.buffer = NULL;
261 SCpnt->SCp.buffers_residual = 0;
262 }
263
264 if (nsphw_start_selection(SCpnt) == FALSE) {
265 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
266 SCpnt->result = DID_BUS_BUSY << 16;
267 nsp_scsi_done(SCpnt);
268 return 0;
269 }
270
271
272 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
273 #ifdef NSP_DEBUG
274 data->CmdId++;
275 #endif
276 return 0;
277 }
278
279 /*
280 * setup PIO FIFO transfer mode and enable/disable to data out
281 */
282 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
283 {
284 unsigned int base = data->BaseAddress;
285 unsigned char transfer_mode_reg;
286
287 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
288
289 if (enabled != FALSE) {
290 transfer_mode_reg = TRANSFER_GO | BRAIND;
291 } else {
292 transfer_mode_reg = 0;
293 }
294
295 transfer_mode_reg |= data->TransferMode;
296
297 nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
298 }
299
300 static void nsphw_init_sync(nsp_hw_data *data)
301 {
302 sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
303 .SyncPeriod = 0,
304 .SyncOffset = 0
305 };
306 int i;
307
308 /* setup sync data */
309 for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
310 data->Sync[i] = tmp_sync;
311 }
312 }
313
314 /*
315 * Initialize Ninja hardware
316 */
317 static int nsphw_init(nsp_hw_data *data)
318 {
319 unsigned int base = data->BaseAddress;
320
321 nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
322
323 data->ScsiClockDiv = CLOCK_40M | FAST_20;
324 data->CurrentSC = NULL;
325 data->FifoCount = 0;
326 data->TransferMode = MODE_IO8;
327
328 nsphw_init_sync(data);
329
330 /* block all interrupts */
331 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
332
333 /* setup SCSI interface */
334 nsp_write(base, IFSELECT, IF_IFSEL);
335
336 nsp_index_write(base, SCSIIRQMODE, 0);
337
338 nsp_index_write(base, TRANSFERMODE, MODE_IO8);
339 nsp_index_write(base, CLOCKDIV, data->ScsiClockDiv);
340
341 nsp_index_write(base, PARITYCTRL, 0);
342 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
343 ACK_COUNTER_CLEAR |
344 REQ_COUNTER_CLEAR |
345 HOST_COUNTER_CLEAR);
346
347 /* setup fifo asic */
348 nsp_write(base, IFSELECT, IF_REGSEL);
349 nsp_index_write(base, TERMPWRCTRL, 0);
350 if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
351 nsp_msg(KERN_INFO, "terminator power on");
352 nsp_index_write(base, TERMPWRCTRL, POWER_ON);
353 }
354
355 nsp_index_write(base, TIMERCOUNT, 0);
356 nsp_index_write(base, TIMERCOUNT, 0); /* requires 2 times!! */
357
358 nsp_index_write(base, SYNCREG, 0);
359 nsp_index_write(base, ACKWIDTH, 0);
360
361 /* enable interrupts and ack them */
362 nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI |
363 RESELECT_EI |
364 SCSI_RESET_IRQ_EI );
365 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
366
367 nsp_setup_fifo(data, FALSE);
368
369 return TRUE;
370 }
371
372 /*
373 * Start selection phase
374 */
375 static int nsphw_start_selection(Scsi_Cmnd *SCpnt)
376 {
377 unsigned int host_id = SCpnt->device->host->this_id;
378 unsigned int base = SCpnt->device->host->io_port;
379 unsigned char target = SCpnt->device->id;
380 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
381 int time_out;
382 unsigned char phase, arbit;
383
384 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
385
386 phase = nsp_index_read(base, SCSIBUSMON);
387 if(phase != BUSMON_BUS_FREE) {
388 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
389 return FALSE;
390 }
391
392 /* start arbitration */
393 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
394 SCpnt->SCp.phase = PH_ARBSTART;
395 nsp_index_write(base, SETARBIT, ARBIT_GO);
396
397 time_out = 1000;
398 do {
399 /* XXX: what a stupid chip! */
400 arbit = nsp_index_read(base, ARBITSTATUS);
401 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
402 udelay(1); /* hold 1.2us */
403 } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
404 (time_out-- != 0));
405
406 if (!(arbit & ARBIT_WIN)) {
407 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
408 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
409 return FALSE;
410 }
411
412 /* assert select line */
413 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
414 SCpnt->SCp.phase = PH_SELSTART;
415 udelay(3); /* wait 2.4us */
416 nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
417 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN);
418 udelay(2); /* wait >1.2us */
419 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
420 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
421 /*udelay(1);*/ /* wait >90ns */
422 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN);
423
424 /* check selection timeout */
425 nsp_start_timer(SCpnt, 1000/51);
426 data->SelectionTimeOut = 1;
427
428 return TRUE;
429 }
430
431 struct nsp_sync_table {
432 unsigned int min_period;
433 unsigned int max_period;
434 unsigned int chip_period;
435 unsigned int ack_width;
436 };
437
438 static struct nsp_sync_table nsp_sync_table_40M[] = {
439 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
440 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
441 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
442 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
443 { 0, 0, 0, 0},
444 };
445
446 static struct nsp_sync_table nsp_sync_table_20M[] = {
447 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
448 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
449 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
450 { 0, 0, 0, 0},
451 };
452
453 /*
454 * setup synchronous data transfer mode
455 */
456 static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt)
457 {
458 unsigned char target = SCpnt->device->id;
459 // unsigned char lun = SCpnt->device->lun;
460 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
461 sync_data *sync = &(data->Sync[target]);
462 struct nsp_sync_table *sync_table;
463 unsigned int period, offset;
464 int i;
465
466
467 nsp_dbg(NSP_DEBUG_SYNC, "in");
468
469 period = sync->SyncPeriod;
470 offset = sync->SyncOffset;
471
472 nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
473
474 if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
475 sync_table = nsp_sync_table_20M;
476 } else {
477 sync_table = nsp_sync_table_40M;
478 }
479
480 for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
481 if ( period >= sync_table->min_period &&
482 period <= sync_table->max_period ) {
483 break;
484 }
485 }
486
487 if (period != 0 && sync_table->max_period == 0) {
488 /*
489 * No proper period/offset found
490 */
491 nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
492
493 sync->SyncPeriod = 0;
494 sync->SyncOffset = 0;
495 sync->SyncRegister = 0;
496 sync->AckWidth = 0;
497
498 return FALSE;
499 }
500
501 sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
502 (offset & SYNCREG_OFFSET_MASK);
503 sync->AckWidth = sync_table->ack_width;
504
505 nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
506
507 return TRUE;
508 }
509
510
511 /*
512 * start ninja hardware timer
513 */
514 static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time)
515 {
516 unsigned int base = SCpnt->device->host->io_port;
517 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
518
519 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
520 data->TimerCount = time;
521 nsp_index_write(base, TIMERCOUNT, time);
522 }
523
524 /*
525 * wait for bus phase change
526 */
527 static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str)
528 {
529 unsigned int base = SCpnt->device->host->io_port;
530 unsigned char reg;
531 int time_out;
532
533 //nsp_dbg(NSP_DEBUG_INTR, "in");
534
535 time_out = 100;
536
537 do {
538 reg = nsp_index_read(base, SCSIBUSMON);
539 if (reg == 0xff) {
540 break;
541 }
542 } while ((time_out-- != 0) && (reg & mask) != 0);
543
544 if (time_out == 0) {
545 nsp_msg(KERN_DEBUG, " %s signal off timeut", str);
546 }
547
548 return 0;
549 }
550
551 /*
552 * expect Ninja Irq
553 */
554 static int nsp_expect_signal(Scsi_Cmnd *SCpnt,
555 unsigned char current_phase,
556 unsigned char mask)
557 {
558 unsigned int base = SCpnt->device->host->io_port;
559 int time_out;
560 unsigned char phase, i_src;
561
562 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
563
564 time_out = 100;
565 do {
566 phase = nsp_index_read(base, SCSIBUSMON);
567 if (phase == 0xff) {
568 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
569 return -1;
570 }
571 i_src = nsp_read(base, IRQSTATUS);
572 if (i_src & IRQSTATUS_SCSI) {
573 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
574 return 0;
575 }
576 if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
577 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
578 return 1;
579 }
580 } while(time_out-- != 0);
581
582 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
583 return -1;
584 }
585
586 /*
587 * transfer SCSI message
588 */
589 static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase)
590 {
591 unsigned int base = SCpnt->device->host->io_port;
592 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
593 char *buf = data->MsgBuffer;
594 int len = min(MSGBUF_SIZE, data->MsgLen);
595 int ptr;
596 int ret;
597
598 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
599 for (ptr = 0; len > 0; len--, ptr++) {
600
601 ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
602 if (ret <= 0) {
603 nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
604 return 0;
605 }
606
607 /* if last byte, negate ATN */
608 if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
609 nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
610 }
611
612 /* read & write message */
613 if (phase & BUSMON_IO) {
614 nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
615 buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
616 } else {
617 nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
618 nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
619 }
620 nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
621
622 }
623 return len;
624 }
625
626 /*
627 * get extra SCSI data from fifo
628 */
629 static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt)
630 {
631 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
632 unsigned int count;
633
634 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
635
636 if (SCpnt->SCp.have_data_in != IO_IN) {
637 return 0;
638 }
639
640 count = nsp_fifo_count(SCpnt);
641 if (data->FifoCount == count) {
642 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
643 return 0;
644 }
645
646 /*
647 * XXX: NSP_QUIRK
648 * data phase skip only occures in case of SCSI_LOW_READ
649 */
650 nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
651 SCpnt->SCp.phase = PH_DATA;
652 nsp_pio_read(SCpnt);
653 nsp_setup_fifo(data, FALSE);
654
655 return 0;
656 }
657
658 /*
659 * accept reselection
660 */
661 static int nsp_reselected(Scsi_Cmnd *SCpnt)
662 {
663 unsigned int base = SCpnt->device->host->io_port;
664 unsigned int host_id = SCpnt->device->host->this_id;
665 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
666 unsigned char bus_reg;
667 unsigned char id_reg, tmp;
668 int target;
669
670 nsp_dbg(NSP_DEBUG_RESELECTION, "in");
671
672 id_reg = nsp_index_read(base, RESELECTID);
673 tmp = id_reg & (~BIT(host_id));
674 target = 0;
675 while(tmp != 0) {
676 if (tmp & BIT(0)) {
677 break;
678 }
679 tmp >>= 1;
680 target++;
681 }
682
683 if (SCpnt->device->id != target) {
684 nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
685 }
686
687 nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
688
689 nsp_nexus(SCpnt);
690 bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
691 nsp_index_write(base, SCSIBUSCTRL, bus_reg);
692 nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
693
694 return TRUE;
695 }
696
697 /*
698 * count how many data transferd
699 */
700 static int nsp_fifo_count(Scsi_Cmnd *SCpnt)
701 {
702 unsigned int base = SCpnt->device->host->io_port;
703 unsigned int count;
704 unsigned int l, m, h, dummy;
705
706 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
707
708 l = nsp_index_read(base, TRANSFERCOUNT);
709 m = nsp_index_read(base, TRANSFERCOUNT);
710 h = nsp_index_read(base, TRANSFERCOUNT);
711 dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */
712
713 count = (h << 16) | (m << 8) | (l << 0);
714
715 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
716
717 return count;
718 }
719
720 /* fifo size */
721 #define RFIFO_CRIT 64
722 #define WFIFO_CRIT 64
723
724 /*
725 * read data in DATA IN phase
726 */
727 static void nsp_pio_read(Scsi_Cmnd *SCpnt)
728 {
729 unsigned int base = SCpnt->device->host->io_port;
730 unsigned long mmio_base = SCpnt->device->host->base;
731 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
732 long time_out;
733 int ocount, res;
734 unsigned char stat, fifo_stat;
735
736 ocount = data->FifoCount;
737
738 nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
739 SCpnt, SCpnt->resid, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual);
740
741 time_out = 1000;
742
743 while ((time_out-- != 0) &&
744 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
745
746 stat = nsp_index_read(base, SCSIBUSMON);
747 stat &= BUSMON_PHASE_MASK;
748
749
750 res = nsp_fifo_count(SCpnt) - ocount;
751 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res);
752 if (res == 0) { /* if some data avilable ? */
753 if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
754 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
755 continue;
756 } else {
757 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
758 break;
759 }
760 }
761
762 fifo_stat = nsp_read(base, FIFOSTATUS);
763 if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
764 stat == BUSPHASE_DATA_IN) {
765 continue;
766 }
767
768 res = min(res, SCpnt->SCp.this_residual);
769
770 switch (data->TransferMode) {
771 case MODE_IO32:
772 res &= ~(BIT(1)|BIT(0)); /* align 4 */
773 nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
774 break;
775 case MODE_IO8:
776 nsp_fifo8_read (base, SCpnt->SCp.ptr, res );
777 break;
778
779 case MODE_MEM32:
780 res &= ~(BIT(1)|BIT(0)); /* align 4 */
781 nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
782 break;
783
784 default:
785 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
786 return;
787 }
788
789 SCpnt->resid -= res;
790 SCpnt->SCp.ptr += res;
791 SCpnt->SCp.this_residual -= res;
792 ocount += res;
793 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
794
795 /* go to next scatter list if available */
796 if (SCpnt->SCp.this_residual == 0 &&
797 SCpnt->SCp.buffers_residual != 0 ) {
798 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
799 SCpnt->SCp.buffers_residual--;
800 SCpnt->SCp.buffer++;
801 SCpnt->SCp.ptr = BUFFER_ADDR;
802 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
803 time_out = 1000;
804
805 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
806 }
807 }
808
809 data->FifoCount = ocount;
810
811 if (time_out == 0) {
812 nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
813 SCpnt->resid, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual);
814 }
815 nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
816 nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
817 }
818
819 /*
820 * write data in DATA OUT phase
821 */
822 static void nsp_pio_write(Scsi_Cmnd *SCpnt)
823 {
824 unsigned int base = SCpnt->device->host->io_port;
825 unsigned long mmio_base = SCpnt->device->host->base;
826 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
827 int time_out;
828 int ocount, res;
829 unsigned char stat;
830
831 ocount = data->FifoCount;
832
833 nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
834 data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, SCpnt->resid);
835
836 time_out = 1000;
837
838 while ((time_out-- != 0) &&
839 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
840 stat = nsp_index_read(base, SCSIBUSMON);
841 stat &= BUSMON_PHASE_MASK;
842
843 if (stat != BUSPHASE_DATA_OUT) {
844 res = ocount - nsp_fifo_count(SCpnt);
845
846 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
847 /* Put back pointer */
848 SCpnt->resid += res;
849 SCpnt->SCp.ptr -= res;
850 SCpnt->SCp.this_residual += res;
851 ocount -= res;
852
853 break;
854 }
855
856 res = ocount - nsp_fifo_count(SCpnt);
857 if (res > 0) { /* write all data? */
858 nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
859 continue;
860 }
861
862 res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
863
864 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
865 switch (data->TransferMode) {
866 case MODE_IO32:
867 res &= ~(BIT(1)|BIT(0)); /* align 4 */
868 nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
869 break;
870 case MODE_IO8:
871 nsp_fifo8_write (base, SCpnt->SCp.ptr, res );
872 break;
873
874 case MODE_MEM32:
875 res &= ~(BIT(1)|BIT(0)); /* align 4 */
876 nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
877 break;
878
879 default:
880 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
881 break;
882 }
883
884 SCpnt->resid -= res;
885 SCpnt->SCp.ptr += res;
886 SCpnt->SCp.this_residual -= res;
887 ocount += res;
888
889 /* go to next scatter list if available */
890 if (SCpnt->SCp.this_residual == 0 &&
891 SCpnt->SCp.buffers_residual != 0 ) {
892 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
893 SCpnt->SCp.buffers_residual--;
894 SCpnt->SCp.buffer++;
895 SCpnt->SCp.ptr = BUFFER_ADDR;
896 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
897 time_out = 1000;
898 }
899 }
900
901 data->FifoCount = ocount;
902
903 if (time_out == 0) {
904 nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x", SCpnt->resid);
905 }
906 nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
907 nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
908 }
909 #undef RFIFO_CRIT
910 #undef WFIFO_CRIT
911
912 /*
913 * setup synchronous/asynchronous data transfer mode
914 */
915 static int nsp_nexus(Scsi_Cmnd *SCpnt)
916 {
917 unsigned int base = SCpnt->device->host->io_port;
918 unsigned char target = SCpnt->device->id;
919 // unsigned char lun = SCpnt->device->lun;
920 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
921 sync_data *sync = &(data->Sync[target]);
922
923 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
924
925 /* setup synch transfer registers */
926 nsp_index_write(base, SYNCREG, sync->SyncRegister);
927 nsp_index_write(base, ACKWIDTH, sync->AckWidth);
928
929 if (SCpnt->use_sg == 0 ||
930 SCpnt->resid % 4 != 0 ||
931 SCpnt->resid <= PAGE_SIZE ) {
932 data->TransferMode = MODE_IO8;
933 } else if (nsp_burst_mode == BURST_MEM32) {
934 data->TransferMode = MODE_MEM32;
935 } else if (nsp_burst_mode == BURST_IO32) {
936 data->TransferMode = MODE_IO32;
937 } else {
938 data->TransferMode = MODE_IO8;
939 }
940
941 /* setup pdma fifo */
942 nsp_setup_fifo(data, TRUE);
943
944 /* clear ack counter */
945 data->FifoCount = 0;
946 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
947 ACK_COUNTER_CLEAR |
948 REQ_COUNTER_CLEAR |
949 HOST_COUNTER_CLEAR);
950
951 return 0;
952 }
953
954 #include "nsp_message.c"
955 /*
956 * interrupt handler
957 */
958 static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs)
959 {
960 unsigned int base;
961 unsigned char irq_status, irq_phase, phase;
962 Scsi_Cmnd *tmpSC;
963 unsigned char target, lun;
964 unsigned int *sync_neg;
965 int i, tmp;
966 nsp_hw_data *data;
967
968
969 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
970 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
971
972 if ( dev_id != NULL &&
973 ((scsi_info_t *)dev_id)->host != NULL ) {
974 scsi_info_t *info = (scsi_info_t *)dev_id;
975
976 data = (nsp_hw_data *)info->host->hostdata;
977 } else {
978 nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
979 return IRQ_NONE;
980 }
981
982 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
983
984 base = data->BaseAddress;
985 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
986
987 /*
988 * interrupt check
989 */
990 nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
991 irq_status = nsp_read(base, IRQSTATUS);
992 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
993 if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
994 nsp_write(base, IRQCONTROL, 0);
995 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
996 return IRQ_NONE;
997 }
998
999 /* XXX: IMPORTANT
1000 * Do not read an irq_phase register if no scsi phase interrupt.
1001 * Unless, you should lose a scsi phase interrupt.
1002 */
1003 phase = nsp_index_read(base, SCSIBUSMON);
1004 if((irq_status & IRQSTATUS_SCSI) != 0) {
1005 irq_phase = nsp_index_read(base, IRQPHASESENCE);
1006 } else {
1007 irq_phase = 0;
1008 }
1009
1010 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1011
1012 /*
1013 * timer interrupt handler (scsi vs timer interrupts)
1014 */
1015 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1016 if (data->TimerCount != 0) {
1017 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1018 nsp_index_write(base, TIMERCOUNT, 0);
1019 nsp_index_write(base, TIMERCOUNT, 0);
1020 data->TimerCount = 0;
1021 }
1022
1023 if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1024 data->SelectionTimeOut == 0) {
1025 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1026 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1027 return IRQ_HANDLED;
1028 }
1029
1030 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1031
1032 if ((irq_status & IRQSTATUS_SCSI) &&
1033 (irq_phase & SCSI_RESET_IRQ)) {
1034 nsp_msg(KERN_ERR, "bus reset (power off?)");
1035
1036 nsphw_init(data);
1037 nsp_bus_reset(data);
1038
1039 if(data->CurrentSC != NULL) {
1040 tmpSC = data->CurrentSC;
1041 tmpSC->result = (DID_RESET << 16) |
1042 ((tmpSC->SCp.Message & 0xff) << 8) |
1043 ((tmpSC->SCp.Status & 0xff) << 0);
1044 nsp_scsi_done(tmpSC);
1045 }
1046 return IRQ_HANDLED;
1047 }
1048
1049 if (data->CurrentSC == NULL) {
1050 nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase);
1051 nsphw_init(data);
1052 nsp_bus_reset(data);
1053 return IRQ_HANDLED;
1054 }
1055
1056 tmpSC = data->CurrentSC;
1057 target = tmpSC->device->id;
1058 lun = tmpSC->device->lun;
1059 sync_neg = &(data->Sync[target].SyncNegotiation);
1060
1061 /*
1062 * parse hardware SCSI irq reasons register
1063 */
1064 if (irq_status & IRQSTATUS_SCSI) {
1065 if (irq_phase & RESELECT_IRQ) {
1066 nsp_dbg(NSP_DEBUG_INTR, "reselect");
1067 nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1068 if (nsp_reselected(tmpSC) != FALSE) {
1069 return IRQ_HANDLED;
1070 }
1071 }
1072
1073 if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1074 return IRQ_HANDLED;
1075 }
1076 }
1077
1078 //show_phase(tmpSC);
1079
1080 switch(tmpSC->SCp.phase) {
1081 case PH_SELSTART:
1082 // *sync_neg = SYNC_NOT_YET;
1083 if ((phase & BUSMON_BSY) == 0) {
1084 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1085 if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1086 nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1087 data->SelectionTimeOut = 0;
1088 nsp_index_write(base, SCSIBUSCTRL, 0);
1089
1090 tmpSC->result = DID_TIME_OUT << 16;
1091 nsp_scsi_done(tmpSC);
1092
1093 return IRQ_HANDLED;
1094 }
1095 data->SelectionTimeOut += 1;
1096 nsp_start_timer(tmpSC, 1000/51);
1097 return IRQ_HANDLED;
1098 }
1099
1100 /* attention assert */
1101 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1102 data->SelectionTimeOut = 0;
1103 tmpSC->SCp.phase = PH_SELECTED;
1104 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1105 udelay(1);
1106 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1107 return IRQ_HANDLED;
1108
1109 break;
1110
1111 case PH_RESELECT:
1112 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1113 // *sync_neg = SYNC_NOT_YET;
1114 if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1115
1116 tmpSC->result = DID_ABORT << 16;
1117 nsp_scsi_done(tmpSC);
1118 return IRQ_HANDLED;
1119 }
1120 /* fall thru */
1121 default:
1122 if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1123 return IRQ_HANDLED;
1124 }
1125 break;
1126 }
1127
1128 /*
1129 * SCSI sequencer
1130 */
1131 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1132
1133 /* normal disconnect */
1134 if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1135 (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1136 nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1137
1138 //*sync_neg = SYNC_NOT_YET;
1139
1140 if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */
1141 tmpSC->result = (DID_OK << 16) |
1142 ((tmpSC->SCp.Message & 0xff) << 8) |
1143 ((tmpSC->SCp.Status & 0xff) << 0);
1144 nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1145 nsp_scsi_done(tmpSC);
1146
1147 return IRQ_HANDLED;
1148 }
1149
1150 return IRQ_HANDLED;
1151 }
1152
1153
1154 /* check unexpected bus free state */
1155 if (phase == 0) {
1156 nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1157
1158 *sync_neg = SYNC_NG;
1159 tmpSC->result = DID_ERROR << 16;
1160 nsp_scsi_done(tmpSC);
1161 return IRQ_HANDLED;
1162 }
1163
1164 switch (phase & BUSMON_PHASE_MASK) {
1165 case BUSPHASE_COMMAND:
1166 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1167 if ((phase & BUSMON_REQ) == 0) {
1168 nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1169 return IRQ_HANDLED;
1170 }
1171
1172 tmpSC->SCp.phase = PH_COMMAND;
1173
1174 nsp_nexus(tmpSC);
1175
1176 /* write scsi command */
1177 nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1178 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1179 for (i = 0; i < tmpSC->cmd_len; i++) {
1180 nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1181 }
1182 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1183 break;
1184
1185 case BUSPHASE_DATA_OUT:
1186 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1187
1188 tmpSC->SCp.phase = PH_DATA;
1189 tmpSC->SCp.have_data_in = IO_OUT;
1190
1191 nsp_pio_write(tmpSC);
1192
1193 break;
1194
1195 case BUSPHASE_DATA_IN:
1196 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1197
1198 tmpSC->SCp.phase = PH_DATA;
1199 tmpSC->SCp.have_data_in = IO_IN;
1200
1201 nsp_pio_read(tmpSC);
1202
1203 break;
1204
1205 case BUSPHASE_STATUS:
1206 nsp_dataphase_bypass(tmpSC);
1207 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1208
1209 tmpSC->SCp.phase = PH_STATUS;
1210
1211 tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1212 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1213
1214 break;
1215
1216 case BUSPHASE_MESSAGE_OUT:
1217 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1218 if ((phase & BUSMON_REQ) == 0) {
1219 goto timer_out;
1220 }
1221
1222 tmpSC->SCp.phase = PH_MSG_OUT;
1223
1224 //*sync_neg = SYNC_NOT_YET;
1225
1226 data->MsgLen = i = 0;
1227 data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1228
1229 if (*sync_neg == SYNC_NOT_YET) {
1230 data->Sync[target].SyncPeriod = 0;
1231 data->Sync[target].SyncOffset = 0;
1232
1233 /**/
1234 data->MsgBuffer[i] = MSG_EXTENDED; i++;
1235 data->MsgBuffer[i] = 3; i++;
1236 data->MsgBuffer[i] = MSG_EXT_SDTR; i++;
1237 data->MsgBuffer[i] = 0x0c; i++;
1238 data->MsgBuffer[i] = 15; i++;
1239 /**/
1240 }
1241 data->MsgLen = i;
1242
1243 nsp_analyze_sdtr(tmpSC);
1244 show_message(data);
1245 nsp_message_out(tmpSC);
1246 break;
1247
1248 case BUSPHASE_MESSAGE_IN:
1249 nsp_dataphase_bypass(tmpSC);
1250 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1251 if ((phase & BUSMON_REQ) == 0) {
1252 goto timer_out;
1253 }
1254
1255 tmpSC->SCp.phase = PH_MSG_IN;
1256 nsp_message_in(tmpSC);
1257
1258 /**/
1259 if (*sync_neg == SYNC_NOT_YET) {
1260 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1261
1262 if (data->MsgLen >= 5 &&
1263 data->MsgBuffer[0] == MSG_EXTENDED &&
1264 data->MsgBuffer[1] == 3 &&
1265 data->MsgBuffer[2] == MSG_EXT_SDTR ) {
1266 data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1267 data->Sync[target].SyncOffset = data->MsgBuffer[4];
1268 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1269 *sync_neg = SYNC_OK;
1270 } else {
1271 data->Sync[target].SyncPeriod = 0;
1272 data->Sync[target].SyncOffset = 0;
1273 *sync_neg = SYNC_NG;
1274 }
1275 nsp_analyze_sdtr(tmpSC);
1276 }
1277 /**/
1278
1279 /* search last messeage byte */
1280 tmp = -1;
1281 for (i = 0; i < data->MsgLen; i++) {
1282 tmp = data->MsgBuffer[i];
1283 if (data->MsgBuffer[i] == MSG_EXTENDED) {
1284 i += (1 + data->MsgBuffer[i+1]);
1285 }
1286 }
1287 tmpSC->SCp.Message = tmp;
1288
1289 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1290 show_message(data);
1291
1292 break;
1293
1294 case BUSPHASE_SELECT:
1295 default:
1296 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1297
1298 break;
1299 }
1300
1301 //nsp_dbg(NSP_DEBUG_INTR, "out");
1302 return IRQ_HANDLED;
1303
1304 timer_out:
1305 nsp_start_timer(tmpSC, 1000/102);
1306 return IRQ_HANDLED;
1307 }
1308
1309 #ifdef NSP_DEBUG
1310 #include "nsp_debug.c"
1311 #endif /* NSP_DEBUG */
1312
1313 /*----------------------------------------------------------------*/
1314 /* look for ninja3 card and init if found */
1315 /*----------------------------------------------------------------*/
1316 static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht)
1317 {
1318 struct Scsi_Host *host; /* registered host structure */
1319 nsp_hw_data *data_b = &nsp_data_base, *data;
1320
1321 nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1322 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1323 host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1324 #else
1325 host = scsi_register(sht, sizeof(nsp_hw_data));
1326 #endif
1327 if (host == NULL) {
1328 nsp_dbg(NSP_DEBUG_INIT, "host failed");
1329 return NULL;
1330 }
1331
1332 memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1333 data = (nsp_hw_data *)host->hostdata;
1334 data->ScsiInfo->host = host;
1335 #ifdef NSP_DEBUG
1336 data->CmdId = 0;
1337 #endif
1338
1339 nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1340
1341 host->unique_id = data->BaseAddress;
1342 host->io_port = data->BaseAddress;
1343 host->n_io_port = data->NumAddress;
1344 host->irq = data->IrqNumber;
1345 host->base = data->MmioAddress;
1346
1347 spin_lock_init(&(data->Lock));
1348
1349 snprintf(data->nspinfo,
1350 sizeof(data->nspinfo),
1351 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1352 host->io_port, host->io_port + host->n_io_port - 1,
1353 host->base,
1354 host->irq);
1355 sht->name = data->nspinfo;
1356
1357 nsp_dbg(NSP_DEBUG_INIT, "end");
1358
1359
1360 return host; /* detect done. */
1361 }
1362
1363 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
1364 static int nsp_detect_old(Scsi_Host_Template *sht)
1365 {
1366 if (nsp_detect(sht) == NULL) {
1367 return 0;
1368 } else {
1369 //MOD_INC_USE_COUNT;
1370 return 1;
1371 }
1372 }
1373
1374
1375 static int nsp_release_old(struct Scsi_Host *shpnt)
1376 {
1377 //nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1378
1379 /* PCMCIA Card Service dose same things below. */
1380 /* So we do nothing. */
1381 //if (shpnt->irq) {
1382 // free_irq(shpnt->irq, data->ScsiInfo);
1383 //}
1384 //if (shpnt->io_port) {
1385 // release_region(shpnt->io_port, shpnt->n_io_port);
1386 //}
1387
1388 //MOD_DEC_USE_COUNT;
1389
1390 return 0;
1391 }
1392 #endif
1393
1394 /*----------------------------------------------------------------*/
1395 /* return info string */
1396 /*----------------------------------------------------------------*/
1397 static const char *nsp_info(struct Scsi_Host *shpnt)
1398 {
1399 nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1400
1401 return data->nspinfo;
1402 }
1403
1404 #undef SPRINTF
1405 #define SPRINTF(args...) \
1406 do { \
1407 if(length > (pos - buffer)) { \
1408 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1409 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1410 } \
1411 } while(0)
1412 static int
1413 nsp_proc_info(
1414 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1415 struct Scsi_Host *host,
1416 #endif
1417 char *buffer,
1418 char **start,
1419 off_t offset,
1420 int length,
1421 #if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1422 int hostno,
1423 #endif
1424 int inout)
1425 {
1426 int id;
1427 char *pos = buffer;
1428 int thislength;
1429 int speed;
1430 unsigned long flags;
1431 nsp_hw_data *data;
1432 #if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1433 struct Scsi_Host *host;
1434 #else
1435 int hostno;
1436 #endif
1437 if (inout) {
1438 return -EINVAL;
1439 }
1440
1441 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1442 hostno = host->host_no;
1443 #else
1444 /* search this HBA host */
1445 host = scsi_host_hn_get(hostno);
1446 if (host == NULL) {
1447 return -ESRCH;
1448 }
1449 #endif
1450 data = (nsp_hw_data *)host->hostdata;
1451
1452
1453 SPRINTF("NinjaSCSI status\n\n");
1454 SPRINTF("Driver version: $Revision: 1.23 $\n");
1455 SPRINTF("SCSI host No.: %d\n", hostno);
1456 SPRINTF("IRQ: %d\n", host->irq);
1457 SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1458 SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1459 SPRINTF("sg_tablesize: %d\n", host->sg_tablesize);
1460
1461 SPRINTF("burst transfer mode: ");
1462 switch (nsp_burst_mode) {
1463 case BURST_IO8:
1464 SPRINTF("io8");
1465 break;
1466 case BURST_IO32:
1467 SPRINTF("io32");
1468 break;
1469 case BURST_MEM32:
1470 SPRINTF("mem32");
1471 break;
1472 default:
1473 SPRINTF("???");
1474 break;
1475 }
1476 SPRINTF("\n");
1477
1478
1479 spin_lock_irqsave(&(data->Lock), flags);
1480 SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC);
1481 spin_unlock_irqrestore(&(data->Lock), flags);
1482
1483 SPRINTF("SDTR status\n");
1484 for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1485
1486 SPRINTF("id %d: ", id);
1487
1488 if (id == host->this_id) {
1489 SPRINTF("----- NinjaSCSI-3 host adapter\n");
1490 continue;
1491 }
1492
1493 switch(data->Sync[id].SyncNegotiation) {
1494 case SYNC_OK:
1495 SPRINTF(" sync");
1496 break;
1497 case SYNC_NG:
1498 SPRINTF("async");
1499 break;
1500 case SYNC_NOT_YET:
1501 SPRINTF(" none");
1502 break;
1503 default:
1504 SPRINTF("?????");
1505 break;
1506 }
1507
1508 if (data->Sync[id].SyncPeriod != 0) {
1509 speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1510
1511 SPRINTF(" transfer %d.%dMB/s, offset %d",
1512 speed / 1000,
1513 speed % 1000,
1514 data->Sync[id].SyncOffset
1515 );
1516 }
1517 SPRINTF("\n");
1518 }
1519
1520 thislength = pos - (buffer + offset);
1521
1522 if(thislength < 0) {
1523 *start = NULL;
1524 return 0;
1525 }
1526
1527
1528 thislength = min(thislength, length);
1529 *start = buffer + offset;
1530
1531 return thislength;
1532 }
1533 #undef SPRINTF
1534
1535 /*---------------------------------------------------------------*/
1536 /* error handler */
1537 /*---------------------------------------------------------------*/
1538
1539 /*static int nsp_eh_strategy(struct Scsi_Host *Shost)
1540 {
1541 return FAILED;
1542 }*/
1543
1544 /*
1545 static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
1546 {
1547 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1548
1549 return nsp_eh_bus_reset(SCpnt);
1550 }*/
1551
1552 /*
1553 static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt)
1554 {
1555 nsp_dbg(NSP_DEBUG_BUSRESET, "%s: SCpnt=0x%p", SCpnt);
1556
1557 return FAILED;
1558 }*/
1559
1560 static int nsp_bus_reset(nsp_hw_data *data)
1561 {
1562 unsigned int base = data->BaseAddress;
1563 int i;
1564
1565 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1566
1567 nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1568 mdelay(100); /* 100ms */
1569 nsp_index_write(base, SCSIBUSCTRL, 0);
1570 for(i = 0; i < 5; i++) {
1571 nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1572 }
1573
1574 nsphw_init_sync(data);
1575
1576 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1577
1578 return SUCCESS;
1579 }
1580
1581 static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt)
1582 {
1583 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1584
1585 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1586
1587 return nsp_bus_reset(data);
1588 }
1589
1590 static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt)
1591 {
1592 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1593
1594 nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1595
1596 nsphw_init(data);
1597
1598 return SUCCESS;
1599 }
1600
1601
1602 /**********************************************************************
1603 PCMCIA functions
1604 **********************************************************************/
1605
1606 /*======================================================================
1607 nsp_cs_attach() creates an "instance" of the driver, allocating
1608 local data structures for one device. The device is registered
1609 with Card Services.
1610
1611 The dev_link structure is initialized, but we don't actually
1612 configure the card at this point -- we wait until we receive a
1613 card insertion event.
1614 ======================================================================*/
1615 static dev_link_t *nsp_cs_attach(void)
1616 {
1617 scsi_info_t *info;
1618 client_reg_t client_reg;
1619 dev_link_t *link;
1620 int ret;
1621 nsp_hw_data *data = &nsp_data_base;
1622
1623 nsp_dbg(NSP_DEBUG_INIT, "in");
1624
1625 /* Create new SCSI device */
1626 info = kmalloc(sizeof(*info), GFP_KERNEL);
1627 if (info == NULL) { return NULL; }
1628 memset(info, 0, sizeof(*info));
1629 link = &info->link;
1630 link->priv = info;
1631 data->ScsiInfo = info;
1632
1633 nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1634
1635 /* The io structure describes IO port mapping */
1636 link->io.NumPorts1 = 0x10;
1637 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1638 link->io.IOAddrLines = 10; /* not used */
1639
1640 /* Interrupt setup */
1641 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1642 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
1643
1644 /* Interrupt handler */
1645 link->irq.Handler = &nspintr;
1646 link->irq.Instance = info;
1647 link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM);
1648
1649 /* General socket configuration */
1650 link->conf.Attributes = CONF_ENABLE_IRQ;
1651 link->conf.Vcc = 50;
1652 link->conf.IntType = INT_MEMORY_AND_IO;
1653 link->conf.Present = PRESENT_OPTION;
1654
1655
1656 /* Register with Card Services */
1657 link->next = dev_list;
1658 dev_list = link;
1659 client_reg.dev_info = &dev_info;
1660 client_reg.EventMask =
1661 CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
1662 CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
1663 CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME ;
1664 client_reg.event_handler = &nsp_cs_event;
1665 client_reg.Version = 0x0210;
1666 client_reg.event_callback_args.client_data = link;
1667 ret = pcmcia_register_client(&link->handle, &client_reg);
1668 if (ret != CS_SUCCESS) {
1669 cs_error(link->handle, RegisterClient, ret);
1670 nsp_cs_detach(link);
1671 return NULL;
1672 }
1673
1674
1675 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1676 return link;
1677 } /* nsp_cs_attach */
1678
1679
1680 /*======================================================================
1681 This deletes a driver "instance". The device is de-registered
1682 with Card Services. If it has been released, all local data
1683 structures are freed. Otherwise, the structures will be freed
1684 when the device is released.
1685 ======================================================================*/
1686 static void nsp_cs_detach(dev_link_t *link)
1687 {
1688 dev_link_t **linkp;
1689
1690 nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1691
1692 /* Locate device structure */
1693 for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) {
1694 if (*linkp == link) {
1695 break;
1696 }
1697 }
1698 if (*linkp == NULL) {
1699 return;
1700 }
1701
1702 if (link->state & DEV_CONFIG)
1703 nsp_cs_release(link);
1704
1705 /* Break the link with Card Services */
1706 if (link->handle) {
1707 pcmcia_deregister_client(link->handle);
1708 }
1709
1710 /* Unlink device structure, free bits */
1711 *linkp = link->next;
1712 kfree(link->priv);
1713 link->priv = NULL;
1714
1715 } /* nsp_cs_detach */
1716
1717
1718 /*======================================================================
1719 nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1720 is received, to configure the PCMCIA socket, and to make the
1721 ethernet device available to the system.
1722 ======================================================================*/
1723 #define CS_CHECK(fn, ret) \
1724 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
1725 /*====================================================================*/
1726 static void nsp_cs_config(dev_link_t *link)
1727 {
1728 client_handle_t handle = link->handle;
1729 scsi_info_t *info = link->priv;
1730 tuple_t tuple;
1731 cisparse_t parse;
1732 int last_ret, last_fn;
1733 unsigned char tuple_data[64];
1734 config_info_t conf;
1735 win_req_t req;
1736 memreq_t map;
1737 cistpl_cftable_entry_t dflt = { 0 };
1738 struct Scsi_Host *host;
1739 nsp_hw_data *data = &nsp_data_base;
1740 #if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1741 Scsi_Device *dev;
1742 dev_node_t **tail, *node;
1743 #endif
1744
1745 nsp_dbg(NSP_DEBUG_INIT, "in");
1746
1747 tuple.DesiredTuple = CISTPL_CONFIG;
1748 tuple.Attributes = 0;
1749 tuple.TupleData = tuple_data;
1750 tuple.TupleDataMax = sizeof(tuple_data);
1751 tuple.TupleOffset = 0;
1752 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
1753 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
1754 CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
1755 link->conf.ConfigBase = parse.config.base;
1756 link->conf.Present = parse.config.rmask[0];
1757
1758 /* Configure card */
1759 link->state |= DEV_CONFIG;
1760
1761 /* Look up the current Vcc */
1762 CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
1763 link->conf.Vcc = conf.Vcc;
1764
1765 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
1766 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
1767 while (1) {
1768 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
1769
1770 if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
1771 pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
1772 goto next_entry;
1773
1774 if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; }
1775 if (cfg->index == 0) { goto next_entry; }
1776 link->conf.ConfigIndex = cfg->index;
1777
1778 /* Does this card need audio output? */
1779 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
1780 link->conf.Attributes |= CONF_ENABLE_SPKR;
1781 link->conf.Status = CCSR_AUDIO_ENA;
1782 }
1783
1784 /* Use power settings for Vcc and Vpp if present */
1785 /* Note that the CIS values need to be rescaled */
1786 if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1787 if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) {
1788 goto next_entry;
1789 }
1790 } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
1791 if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) {
1792 goto next_entry;
1793 }
1794 }
1795
1796 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1797 link->conf.Vpp1 = link->conf.Vpp2 =
1798 cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1799 } else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1800 link->conf.Vpp1 = link->conf.Vpp2 =
1801 dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
1802 }
1803
1804 /* Do we need to allocate an interrupt? */
1805 if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) {
1806 link->conf.Attributes |= CONF_ENABLE_IRQ;
1807 }
1808
1809 /* IO window settings */
1810 link->io.NumPorts1 = link->io.NumPorts2 = 0;
1811 if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
1812 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
1813 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1814 if (!(io->flags & CISTPL_IO_8BIT))
1815 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1816 if (!(io->flags & CISTPL_IO_16BIT))
1817 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1818 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1819 link->io.BasePort1 = io->win[0].base;
1820 link->io.NumPorts1 = io->win[0].len;
1821 if (io->nwin > 1) {
1822 link->io.Attributes2 = link->io.Attributes1;
1823 link->io.BasePort2 = io->win[1].base;
1824 link->io.NumPorts2 = io->win[1].len;
1825 }
1826 /* This reserves IO space but doesn't actually enable it */
1827 if (pcmcia_request_io(link->handle, &link->io) != 0)
1828 goto next_entry;
1829 }
1830
1831 if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
1832 cistpl_mem_t *mem =
1833 (cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
1834 req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
1835 req.Attributes |= WIN_ENABLE;
1836 req.Base = mem->win[0].host_addr;
1837 req.Size = mem->win[0].len;
1838 if (req.Size < 0x1000) {
1839 req.Size = 0x1000;
1840 }
1841 req.AccessSpeed = 0;
1842 if (pcmcia_request_window(&link->handle, &req, &link->win) != 0)
1843 goto next_entry;
1844 map.Page = 0; map.CardOffset = mem->win[0].card_addr;
1845 if (pcmcia_map_mem_page(link->win, &map) != 0)
1846 goto next_entry;
1847
1848 data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size);
1849 data->MmioLength = req.Size;
1850 }
1851 /* If we got this far, we're cool! */
1852 break;
1853
1854 next_entry:
1855 nsp_dbg(NSP_DEBUG_INIT, "next");
1856
1857 if (link->io.NumPorts1) {
1858 pcmcia_release_io(link->handle, &link->io);
1859 }
1860 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
1861 }
1862
1863 if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1864 CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
1865 }
1866 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
1867
1868 if (free_ports) {
1869 if (link->io.BasePort1) {
1870 release_region(link->io.BasePort1, link->io.NumPorts1);
1871 }
1872 if (link->io.BasePort2) {
1873 release_region(link->io.BasePort2, link->io.NumPorts2);
1874 }
1875 }
1876
1877 /* Set port and IRQ */
1878 data->BaseAddress = link->io.BasePort1;
1879 data->NumAddress = link->io.NumPorts1;
1880 data->IrqNumber = link->irq.AssignedIRQ;
1881
1882 nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1883 data->BaseAddress, data->NumAddress, data->IrqNumber);
1884
1885 if(nsphw_init(data) == FALSE) {
1886 goto cs_failed;
1887 }
1888
1889 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2))
1890 host = nsp_detect(&nsp_driver_template);
1891 #else
1892 scsi_register_host(&nsp_driver_template);
1893 for (host = scsi_host_get_next(NULL); host != NULL;
1894 host = scsi_host_get_next(host)) {
1895 if (host->hostt == &nsp_driver_template) {
1896 break;
1897 }
1898 }
1899 #endif
1900
1901 if (host == NULL) {
1902 nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1903 goto cs_failed;
1904 }
1905
1906
1907 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1908 scsi_add_host (host, NULL);
1909 scsi_scan_host(host);
1910
1911 snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no);
1912 link->dev = &info->node;
1913 info->host = host;
1914
1915 #else
1916 nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO");
1917 tail = &link->dev;
1918 info->ndev = 0;
1919
1920 nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1921
1922 for (dev = host->host_queue; dev != NULL; dev = dev->next) {
1923 unsigned long id;
1924 id = (dev->id & 0x0f) + ((dev->lun & 0x0f) << 4) +
1925 ((dev->channel & 0x0f) << 8) +
1926 ((dev->host->host_no & 0x0f) << 12);
1927 node = &info->node[info->ndev];
1928 node->minor = 0;
1929 switch (dev->type) {
1930 case TYPE_TAPE:
1931 node->major = SCSI_TAPE_MAJOR;
1932 snprintf(node->dev_name, sizeof(node->dev_name), "st#%04lx", id);
1933 break;
1934 case TYPE_DISK:
1935 case TYPE_MOD:
1936 node->major = SCSI_DISK0_MAJOR;
1937 snprintf(node->dev_name, sizeof(node->dev_name), "sd#%04lx", id);
1938 break;
1939 case TYPE_ROM:
1940 case TYPE_WORM:
1941 node->major = SCSI_CDROM_MAJOR;
1942 snprintf(node->dev_name, sizeof(node->dev_name), "sr#%04lx", id);
1943 break;
1944 default:
1945 node->major = SCSI_GENERIC_MAJOR;
1946 snprintf(node->dev_name, sizeof(node->dev_name), "sg#%04lx", id);
1947 break;
1948 }
1949 *tail = node; tail = &node->next;
1950 info->ndev++;
1951 info->host = dev->host;
1952 }
1953
1954 *tail = NULL;
1955 if (info->ndev == 0) {
1956 nsp_msg(KERN_INFO, "no SCSI devices found");
1957 }
1958 nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1959 #endif
1960
1961 /* Finally, report what we've done */
1962 printk(KERN_INFO "nsp_cs: index 0x%02x: Vcc %d.%d",
1963 link->conf.ConfigIndex,
1964 link->conf.Vcc/10, link->conf.Vcc%10);
1965 if (link->conf.Vpp1) {
1966 printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10);
1967 }
1968 if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1969 printk(", irq %d", link->irq.AssignedIRQ);
1970 }
1971 if (link->io.NumPorts1) {
1972 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1973 link->io.BasePort1+link->io.NumPorts1-1);
1974 }
1975 if (link->io.NumPorts2)
1976 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1977 link->io.BasePort2+link->io.NumPorts2-1);
1978 if (link->win)
1979 printk(", mem 0x%06lx-0x%06lx", req.Base,
1980 req.Base+req.Size-1);
1981 printk("\n");
1982
1983 link->state &= ~DEV_CONFIG_PENDING;
1984 return;
1985
1986 cs_failed:
1987 nsp_dbg(NSP_DEBUG_INIT, "config fail");
1988 cs_error(link->handle, last_fn, last_ret);
1989 nsp_cs_release(link);
1990
1991 return;
1992 } /* nsp_cs_config */
1993 #undef CS_CHECK
1994
1995
1996 /*======================================================================
1997 After a card is removed, nsp_cs_release() will unregister the net
1998 device, and release the PCMCIA configuration. If the device is
1999 still open, this will be postponed until it is closed.
2000 ======================================================================*/
2001 static void nsp_cs_release(dev_link_t *link)
2002 {
2003 scsi_info_t *info = link->priv;
2004 nsp_hw_data *data = NULL;
2005
2006 if (info->host == NULL) {
2007 nsp_msg(KERN_DEBUG, "unexpected card release call.");
2008 } else {
2009 data = (nsp_hw_data *)info->host->hostdata;
2010 }
2011
2012 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
2013
2014 /* Unlink the device chain */
2015 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
2016 if (info->host != NULL) {
2017 scsi_remove_host(info->host);
2018 }
2019 #else
2020 scsi_unregister_host(&nsp_driver_template);
2021 #endif
2022 link->dev = NULL;
2023
2024 if (link->win) {
2025 if (data != NULL) {
2026 iounmap((void *)(data->MmioAddress));
2027 }
2028 pcmcia_release_window(link->win);
2029 }
2030 pcmcia_release_configuration(link->handle);
2031 if (link->io.NumPorts1) {
2032 pcmcia_release_io(link->handle, &link->io);
2033 }
2034 if (link->irq.AssignedIRQ) {
2035 pcmcia_release_irq(link->handle, &link->irq);
2036 }
2037 link->state &= ~DEV_CONFIG;
2038 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
2039 if (info->host != NULL) {
2040 scsi_host_put(info->host);
2041 }
2042 #endif
2043 } /* nsp_cs_release */
2044
2045 /*======================================================================
2046
2047 The card status event handler. Mostly, this schedules other
2048 stuff to run after an event is received. A CARD_REMOVAL event
2049 also sets some flags to discourage the net drivers from trying
2050 to talk to the card any more.
2051
2052 When a CARD_REMOVAL event is received, we immediately set a flag
2053 to block future accesses to this device. All the functions that
2054 actually access the device should check this flag to make sure
2055 the card is still present.
2056
2057 ======================================================================*/
2058 static int nsp_cs_event(event_t event,
2059 int priority,
2060 event_callback_args_t *args)
2061 {
2062 dev_link_t *link = args->client_data;
2063 scsi_info_t *info = link->priv;
2064 nsp_hw_data *data;
2065
2066 nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event);
2067
2068 switch (event) {
2069 case CS_EVENT_CARD_REMOVAL:
2070 nsp_dbg(NSP_DEBUG_INIT, "event: remove");
2071 link->state &= ~DEV_PRESENT;
2072 if (link->state & DEV_CONFIG) {
2073 ((scsi_info_t *)link->priv)->stop = 1;
2074 nsp_cs_release(link);
2075 }
2076 break;
2077
2078 case CS_EVENT_CARD_INSERTION:
2079 nsp_dbg(NSP_DEBUG_INIT, "event: insert");
2080 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
2081 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,68))
2082 info->bus = args->bus;
2083 #endif
2084 nsp_cs_config(link);
2085 break;
2086
2087 case CS_EVENT_PM_SUSPEND:
2088 nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
2089 link->state |= DEV_SUSPEND;
2090 /* Fall through... */
2091 case CS_EVENT_RESET_PHYSICAL:
2092 /* Mark the device as stopped, to block IO until later */
2093 nsp_dbg(NSP_DEBUG_INIT, "event: reset physical");
2094
2095 if (info->host != NULL) {
2096 nsp_msg(KERN_INFO, "clear SDTR status");
2097
2098 data = (nsp_hw_data *)info->host->hostdata;
2099
2100 nsphw_init_sync(data);
2101 }
2102
2103 info->stop = 1;
2104 if (link->state & DEV_CONFIG) {
2105 pcmcia_release_configuration(link->handle);
2106 }
2107 break;
2108
2109 case CS_EVENT_PM_RESUME:
2110 nsp_dbg(NSP_DEBUG_INIT, "event: resume");
2111 link->state &= ~DEV_SUSPEND;
2112 /* Fall through... */
2113 case CS_EVENT_CARD_RESET:
2114 nsp_dbg(NSP_DEBUG_INIT, "event: reset");
2115 if (link->state & DEV_CONFIG) {
2116 pcmcia_request_configuration(link->handle, &link->conf);
2117 }
2118 info->stop = 0;
2119
2120 if (info->host != NULL) {
2121 nsp_msg(KERN_INFO, "reset host and bus");
2122
2123 data = (nsp_hw_data *)info->host->hostdata;
2124
2125 nsphw_init (data);
2126 nsp_bus_reset(data);
2127 }
2128
2129 break;
2130
2131 default:
2132 nsp_dbg(NSP_DEBUG_INIT, "event: unknown");
2133 break;
2134 }
2135 nsp_dbg(NSP_DEBUG_INIT, "end");
2136 return 0;
2137 } /* nsp_cs_event */
2138
2139 /*======================================================================*
2140 * module entry point
2141 *====================================================================*/
2142 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2143 static struct pcmcia_driver nsp_driver = {
2144 .owner = THIS_MODULE,
2145 .drv = {
2146 .name = "nsp_cs",
2147 },
2148 .attach = nsp_cs_attach,
2149 .detach = nsp_cs_detach,
2150 };
2151 #endif
2152
2153 static int __init nsp_cs_init(void)
2154 {
2155 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2156 nsp_msg(KERN_INFO, "loading...");
2157
2158 return pcmcia_register_driver(&nsp_driver);
2159 #else
2160 servinfo_t serv;
2161
2162 nsp_msg(KERN_INFO, "loading...");
2163 pcmcia_get_card_services_info(&serv);
2164 if (serv.Revision != CS_RELEASE_CODE) {
2165 nsp_msg(KERN_DEBUG, "Card Services release does not match!");
2166 return -EINVAL;
2167 }
2168 register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach);
2169
2170 nsp_dbg(NSP_DEBUG_INIT, "out");
2171 return 0;
2172 #endif
2173 }
2174
2175 static void __exit nsp_cs_exit(void)
2176 {
2177 nsp_msg(KERN_INFO, "unloading...");
2178
2179 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2180 pcmcia_unregister_driver(&nsp_driver);
2181 BUG_ON(dev_list != NULL);
2182 #else
2183 unregister_pcmcia_driver(&dev_info);
2184 /* XXX: this really needs to move into generic code.. */
2185 while (dev_list != NULL) {
2186 if (dev_list->state & DEV_CONFIG) {
2187 nsp_cs_release(dev_list);
2188 }
2189 nsp_cs_detach(dev_list);
2190 }
2191 #endif
2192 }
2193
2194
2195 module_init(nsp_cs_init)
2196 module_exit(nsp_cs_exit)
2197
2198 /* end */