Blame view

drivers/scsi/mac_scsi.c 12.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  /*
   * Generic Macintosh NCR5380 driver
   *
   * Copyright 1998, Michael Schmitz <mschmitz@lbl.gov>
   *
   * derived in part from:
   */
  /*
   * Generic Generic NCR5380 driver
   *
   * Copyright 1995, Russell King
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #include <linux/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
  #include <linux/ioport.h>
  #include <linux/init.h>
  #include <linux/blkdev.h>
  #include <linux/interrupt.h>
cbad48deb   Finn Thain   mac_scsi: Convert...
19
  #include <linux/platform_device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20

cbad48deb   Finn Thain   mac_scsi: Convert...
21
  #include <asm/hwtest.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  #include <asm/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #include <asm/macints.h>
cbad48deb   Finn Thain   mac_scsi: Convert...
24
  #include <asm/setup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  #include <scsi/scsi_host.h>
92de38315   Finn Thain   mac_scsi: Remove ...
27
28
  
  /* Definitions for the core NCR5380 driver. */
e744fdea5   Boaz Harrosh   scsi_mac.h: Defin...
29

820682b1b   Finn Thain   scsi: ncr5380: St...
30
  #define NCR5380_implementation_fields   int pdma_residual
92de38315   Finn Thain   mac_scsi: Remove ...
31

61e1ce588   Finn Thain   scsi: ncr5380: Us...
32
33
  #define NCR5380_read(reg)           in_8(hostdata->io + ((reg) << 4))
  #define NCR5380_write(reg, value)   out_8(hostdata->io + ((reg) << 4), value)
92de38315   Finn Thain   mac_scsi: Remove ...
34

4a98f896b   Finn Thain   scsi: ncr5380: Us...
35
  #define NCR5380_dma_xfer_len            macscsi_dma_xfer_len
6c4b88ca5   Finn Thain   ncr5380: Use DMA ...
36
37
  #define NCR5380_dma_recv_setup          macscsi_pread
  #define NCR5380_dma_send_setup          macscsi_pwrite
4a98f896b   Finn Thain   scsi: ncr5380: Us...
38
  #define NCR5380_dma_residual            macscsi_dma_residual
92de38315   Finn Thain   mac_scsi: Remove ...
39
40
41
42
  
  #define NCR5380_intr                    macscsi_intr
  #define NCR5380_queue_command           macscsi_queue_command
  #define NCR5380_abort                   macscsi_abort
12e5fc665   Hannes Reinecke   scsi: NCR5380: Mo...
43
  #define NCR5380_host_reset              macscsi_host_reset
92de38315   Finn Thain   mac_scsi: Remove ...
44
  #define NCR5380_info                    macscsi_info
92de38315   Finn Thain   mac_scsi: Remove ...
45

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  #include "NCR5380.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  static int setup_can_queue = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
48
  module_param(setup_can_queue, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  static int setup_cmd_per_lun = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
50
  module_param(setup_cmd_per_lun, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  static int setup_sg_tablesize = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
52
  module_param(setup_sg_tablesize, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  static int setup_use_pdma = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
54
  module_param(setup_use_pdma, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  static int setup_hostid = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
56
  module_param(setup_hostid, int, 0);
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
57
58
  static int setup_toshiba_delay = -1;
  module_param(setup_toshiba_delay, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59

6e9ae6d56   Finn Thain   mac_scsi: Add mod...
60
61
62
  #ifndef MODULE
  static int __init mac_scsi_setup(char *str)
  {
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
63
  	int ints[8];
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
64
65
  
  	(void)get_options(str, ARRAY_SIZE(ints), ints);
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
66
67
68
  	if (ints[0] < 1) {
  		pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>[,<toshiba_delay>]]]]]]
  ");
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
69
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  	}
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
71
72
73
74
75
76
77
78
  	if (ints[0] >= 1)
  		setup_can_queue = ints[1];
  	if (ints[0] >= 2)
  		setup_cmd_per_lun = ints[2];
  	if (ints[0] >= 3)
  		setup_sg_tablesize = ints[3];
  	if (ints[0] >= 4)
  		setup_hostid = ints[4];
c4ec6f924   Finn Thain   ncr5380: Remove d...
79
  	/* ints[5] (use_tagged_queuing) is ignored */
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
80
  	if (ints[0] >= 6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  		setup_use_pdma = ints[6];
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
82
83
  	if (ints[0] >= 7)
  		setup_toshiba_delay = ints[7];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
87
  	return 1;
  }
  
  __setup("mac5380=", mac_scsi_setup);
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
88
  #endif /* !MODULE */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89

3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
90
91
92
  /* Pseudo DMA asm originally by Ove Edlund */
  
  #define CP_IO_TO_MEM(s,d,n)				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  __asm__ __volatile__					\
      ("    cmp.w  #4,%2
  "				\
       "    bls    8f
  "					\
       "    move.w %1,%%d0
  "				\
       "    neg.b  %%d0
  "				\
       "    and.w  #3,%%d0
  "				\
       "    sub.w  %%d0,%2
  "				\
       "    bra    2f
  "					\
       " 1: move.b (%0),(%1)+
  "				\
       " 2: dbf    %%d0,1b
  "				\
       "    move.w %2,%%d0
  "				\
       "    lsr.w  #5,%%d0
  "				\
       "    bra    4f
  "					\
       " 3: move.l (%0),(%1)+
  "				\
       "31: move.l (%0),(%1)+
  "				\
       "32: move.l (%0),(%1)+
  "				\
       "33: move.l (%0),(%1)+
  "				\
       "34: move.l (%0),(%1)+
  "				\
       "35: move.l (%0),(%1)+
  "				\
       "36: move.l (%0),(%1)+
  "				\
       "37: move.l (%0),(%1)+
  "				\
       " 4: dbf    %%d0,3b
  "				\
       "    move.w %2,%%d0
  "				\
       "    lsr.w  #2,%%d0
  "				\
       "    and.w  #7,%%d0
  "				\
       "    bra    6f
  "					\
       " 5: move.l (%0),(%1)+
  "				\
       " 6: dbf    %%d0,5b
  "				\
       "    and.w  #3,%2
  "				\
       "    bra    8f
  "					\
       " 7: move.b (%0),(%1)+
  "				\
       " 8: dbf    %2,7b
  "				\
       "    moveq.l #0, %2
  "				\
       " 9: 
  "						\
       ".section .fixup,\"ax\"
  "				\
       "    .even
  "					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
164
165
166
167
168
169
       "91: moveq.l #1, %2
  "				\
       "    jra 9b
  "					\
       "94: moveq.l #4, %2
  "				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
172
173
174
175
176
177
       "    jra 9b
  "					\
       ".previous
  "					\
       ".section __ex_table,\"a\"
  "			\
       "   .align 4
  "					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
       "   .long  1b,91b
  "				\
       "   .long  3b,94b
  "				\
       "   .long 31b,94b
  "				\
       "   .long 32b,94b
  "				\
       "   .long 33b,94b
  "				\
       "   .long 34b,94b
  "				\
       "   .long 35b,94b
  "				\
       "   .long 36b,94b
  "				\
       "   .long 37b,94b
  "				\
       "   .long  5b,94b
  "				\
       "   .long  7b,91b
  "				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
       ".previous"					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
201
202
       : "=a"(s), "=a"(d), "=d"(n)			\
       : "0"(s), "1"(d), "2"(n)				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
       : "d0")
4a98f896b   Finn Thain   scsi: ncr5380: Us...
204
205
  static inline int macscsi_pread(struct NCR5380_hostdata *hostdata,
                                  unsigned char *dst, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
  {
4ab2a7878   Finn Thain   scsi: ncr5380: Re...
207
  	u8 __iomem *s = hostdata->pdma_io + (INPUT_DATA_REG << 4);
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
208
209
210
  	unsigned char *d = dst;
  	int n = len;
  	int transferred;
d5d37a0ab   Finn Thain   scsi: ncr5380: Pa...
211
  	while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
212
213
214
215
216
217
218
219
220
221
222
223
  	                              BASR_DRQ | BASR_PHASE_MATCH,
  	                              BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) {
  		CP_IO_TO_MEM(s, d, n);
  
  		transferred = d - dst - n;
  		hostdata->pdma_residual = len - transferred;
  
  		/* No bus error. */
  		if (n == 0)
  			return 0;
  
  		/* Target changed phase early? */
d5d37a0ab   Finn Thain   scsi: ncr5380: Pa...
224
  		if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
225
226
227
228
229
230
  		                           BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0)
  			scmd_printk(KERN_ERR, hostdata->connected,
  			            "%s: !REQ and !ACK
  ", __func__);
  		if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH))
  			return 0;
4a98f896b   Finn Thain   scsi: ncr5380: Us...
231
  		dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
232
233
  		         "%s: bus error (%d/%d)
  ", __func__, transferred, len);
4a98f896b   Finn Thain   scsi: ncr5380: Us...
234
  		NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
235
236
  		d = dst + transferred;
  		n = len - transferred;
ffdede67d   Finn Thain   mac_scsi: Cleanup...
237
  	}
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
238
239
240
  	scmd_printk(KERN_ERR, hostdata->connected,
  	            "%s: phase mismatch or !DRQ
  ", __func__);
4a98f896b   Finn Thain   scsi: ncr5380: Us...
241
  	NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
242
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
  }
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
244
  #define CP_MEM_TO_IO(s,d,n)				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  __asm__ __volatile__					\
      ("    cmp.w  #4,%2
  "				\
       "    bls    8f
  "					\
       "    move.w %0,%%d0
  "				\
       "    neg.b  %%d0
  "				\
       "    and.w  #3,%%d0
  "				\
       "    sub.w  %%d0,%2
  "				\
       "    bra    2f
  "					\
       " 1: move.b (%0)+,(%1)
  "				\
       " 2: dbf    %%d0,1b
  "				\
       "    move.w %2,%%d0
  "				\
       "    lsr.w  #5,%%d0
  "				\
       "    bra    4f
  "					\
       " 3: move.l (%0)+,(%1)
  "				\
       "31: move.l (%0)+,(%1)
  "				\
       "32: move.l (%0)+,(%1)
  "				\
       "33: move.l (%0)+,(%1)
  "				\
       "34: move.l (%0)+,(%1)
  "				\
       "35: move.l (%0)+,(%1)
  "				\
       "36: move.l (%0)+,(%1)
  "				\
       "37: move.l (%0)+,(%1)
  "				\
       " 4: dbf    %%d0,3b
  "				\
       "    move.w %2,%%d0
  "				\
       "    lsr.w  #2,%%d0
  "				\
       "    and.w  #7,%%d0
  "				\
       "    bra    6f
  "					\
       " 5: move.l (%0)+,(%1)
  "				\
       " 6: dbf    %%d0,5b
  "				\
       "    and.w  #3,%2
  "				\
       "    bra    8f
  "					\
       " 7: move.b (%0)+,(%1)
  "				\
       " 8: dbf    %2,7b
  "				\
       "    moveq.l #0, %2
  "				\
       " 9: 
  "						\
       ".section .fixup,\"ax\"
  "				\
       "    .even
  "					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
316
317
318
319
320
321
       "91: moveq.l #1, %2
  "				\
       "    jra 9b
  "					\
       "94: moveq.l #4, %2
  "				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
324
325
326
327
328
329
       "    jra 9b
  "					\
       ".previous
  "					\
       ".section __ex_table,\"a\"
  "			\
       "   .align 4
  "					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
       "   .long  1b,91b
  "				\
       "   .long  3b,94b
  "				\
       "   .long 31b,94b
  "				\
       "   .long 32b,94b
  "				\
       "   .long 33b,94b
  "				\
       "   .long 34b,94b
  "				\
       "   .long 35b,94b
  "				\
       "   .long 36b,94b
  "				\
       "   .long 37b,94b
  "				\
       "   .long  5b,94b
  "				\
       "   .long  7b,91b
  "				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
       ".previous"					\
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
353
354
       : "=a"(s), "=a"(d), "=d"(n)			\
       : "0"(s), "1"(d), "2"(n)				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
       : "d0")
4a98f896b   Finn Thain   scsi: ncr5380: Us...
356
357
  static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata,
                                   unsigned char *src, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
  {
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
359
  	unsigned char *s = src;
4ab2a7878   Finn Thain   scsi: ncr5380: Re...
360
  	u8 __iomem *d = hostdata->pdma_io + (OUTPUT_DATA_REG << 4);
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
361
362
  	int n = len;
  	int transferred;
d5d37a0ab   Finn Thain   scsi: ncr5380: Pa...
363
  	while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
364
365
366
367
368
369
370
371
  	                              BASR_DRQ | BASR_PHASE_MATCH,
  	                              BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) {
  		CP_MEM_TO_IO(s, d, n);
  
  		transferred = s - src - n;
  		hostdata->pdma_residual = len - transferred;
  
  		/* Target changed phase early? */
d5d37a0ab   Finn Thain   scsi: ncr5380: Pa...
372
  		if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
373
374
375
376
377
378
379
380
381
  		                           BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0)
  			scmd_printk(KERN_ERR, hostdata->connected,
  			            "%s: !REQ and !ACK
  ", __func__);
  		if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH))
  			return 0;
  
  		/* No bus error. */
  		if (n == 0) {
d5d37a0ab   Finn Thain   scsi: ncr5380: Pa...
382
  			if (NCR5380_poll_politely(hostdata, TARGET_COMMAND_REG,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
383
384
385
386
387
388
389
  			                          TCR_LAST_BYTE_SENT,
  			                          TCR_LAST_BYTE_SENT, HZ / 64) < 0)
  				scmd_printk(KERN_ERR, hostdata->connected,
  				            "%s: Last Byte Sent timeout
  ", __func__);
  			return 0;
  		}
4a98f896b   Finn Thain   scsi: ncr5380: Us...
390
  		dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
391
392
  		         "%s: bus error (%d/%d)
  ", __func__, transferred, len);
4a98f896b   Finn Thain   scsi: ncr5380: Us...
393
  		NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
394
395
  		s = src + transferred;
  		n = len - transferred;
ffdede67d   Finn Thain   mac_scsi: Cleanup...
396
  	}
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
397
398
399
  	scmd_printk(KERN_ERR, hostdata->connected,
  	            "%s: phase mismatch or !DRQ
  ", __func__);
4a98f896b   Finn Thain   scsi: ncr5380: Us...
400
  	NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
ffdede67d   Finn Thain   mac_scsi: Cleanup...
401

3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
402
  	return -1;
ffdede67d   Finn Thain   mac_scsi: Cleanup...
403
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404

4a98f896b   Finn Thain   scsi: ncr5380: Us...
405
  static int macscsi_dma_xfer_len(struct NCR5380_hostdata *hostdata,
7e9ec8d9c   Finn Thain   ncr5380: Remove F...
406
407
                                  struct scsi_cmnd *cmd)
  {
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
408
409
  	if (hostdata->flags & FLAG_NO_PSEUDO_DMA ||
  	    cmd->SCp.this_residual < 16)
7e9ec8d9c   Finn Thain   ncr5380: Remove F...
410
  		return 0;
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
411
  	return cmd->SCp.this_residual;
7e9ec8d9c   Finn Thain   ncr5380: Remove F...
412
  }
4a98f896b   Finn Thain   scsi: ncr5380: Us...
413
414
415
416
  static int macscsi_dma_residual(struct NCR5380_hostdata *hostdata)
  {
  	return hostdata->pdma_residual;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
417
  #include "NCR5380.c"
cbad48deb   Finn Thain   mac_scsi: Convert...
418
419
420
421
  #define DRV_MODULE_NAME         "mac_scsi"
  #define PFX                     DRV_MODULE_NAME ": "
  
  static struct scsi_host_template mac_scsi_template = {
aa2e2cb1d   Finn Thain   ncr5380: Fix and ...
422
423
  	.module			= THIS_MODULE,
  	.proc_name		= DRV_MODULE_NAME,
aa2e2cb1d   Finn Thain   ncr5380: Fix and ...
424
425
426
427
  	.name			= "Macintosh NCR5380 SCSI",
  	.info			= macscsi_info,
  	.queuecommand		= macscsi_queue_command,
  	.eh_abort_handler	= macscsi_abort,
12e5fc665   Hannes Reinecke   scsi: NCR5380: Mo...
428
  	.eh_host_reset_handler	= macscsi_host_reset,
aa2e2cb1d   Finn Thain   ncr5380: Fix and ...
429
430
  	.can_queue		= 16,
  	.this_id		= 7,
3a0f64bfa   Finn Thain   mac_scsi: Fix pse...
431
  	.sg_tablesize		= 1,
aa2e2cb1d   Finn Thain   ncr5380: Fix and ...
432
433
  	.cmd_per_lun		= 2,
  	.use_clustering		= DISABLE_CLUSTERING,
32b26a104   Finn Thain   ncr5380: Use stan...
434
  	.cmd_size		= NCR5380_CMD_SIZE,
0a4e36125   Finn Thain   ncr5380: Fix soft...
435
  	.max_sectors		= 128,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
  };
cbad48deb   Finn Thain   mac_scsi: Convert...
437
438
439
  static int __init mac_scsi_probe(struct platform_device *pdev)
  {
  	struct Scsi_Host *instance;
820682b1b   Finn Thain   scsi: ncr5380: St...
440
  	struct NCR5380_hostdata *hostdata;
cbad48deb   Finn Thain   mac_scsi: Convert...
441
442
443
444
445
446
447
  	int error;
  	int host_flags = 0;
  	struct resource *irq, *pio_mem, *pdma_mem = NULL;
  
  	pio_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  	if (!pio_mem)
  		return -ENODEV;
cbad48deb   Finn Thain   mac_scsi: Convert...
448
  	pdma_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
cbad48deb   Finn Thain   mac_scsi: Convert...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
  
  	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  
  	if (!hwreg_present((unsigned char *)pio_mem->start +
  	                   (STATUS_REG << 4))) {
  		pr_info(PFX "no device detected at %pap
  ", &pio_mem->start);
  		return -ENODEV;
  	}
  
  	if (setup_can_queue > 0)
  		mac_scsi_template.can_queue = setup_can_queue;
  	if (setup_cmd_per_lun > 0)
  		mac_scsi_template.cmd_per_lun = setup_cmd_per_lun;
  	if (setup_sg_tablesize >= 0)
  		mac_scsi_template.sg_tablesize = setup_sg_tablesize;
  	if (setup_hostid >= 0)
  		mac_scsi_template.this_id = setup_hostid & 7;
cbad48deb   Finn Thain   mac_scsi: Convert...
467
468
469
470
471
  
  	instance = scsi_host_alloc(&mac_scsi_template,
  	                           sizeof(struct NCR5380_hostdata));
  	if (!instance)
  		return -ENOMEM;
cbad48deb   Finn Thain   mac_scsi: Convert...
472
473
474
475
  	if (irq)
  		instance->irq = irq->start;
  	else
  		instance->irq = NO_IRQ;
820682b1b   Finn Thain   scsi: ncr5380: St...
476
477
  	hostdata = shost_priv(instance);
  	hostdata->base = pio_mem->start;
4ab2a7878   Finn Thain   scsi: ncr5380: Re...
478
  	hostdata->io = (u8 __iomem *)pio_mem->start;
cbad48deb   Finn Thain   mac_scsi: Convert...
479

820682b1b   Finn Thain   scsi: ncr5380: St...
480
  	if (pdma_mem && setup_use_pdma)
4ab2a7878   Finn Thain   scsi: ncr5380: Re...
481
  		hostdata->pdma_io = (u8 __iomem *)pdma_mem->start;
820682b1b   Finn Thain   scsi: ncr5380: St...
482
  	else
cbad48deb   Finn Thain   mac_scsi: Convert...
483
  		host_flags |= FLAG_NO_PSEUDO_DMA;
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
484
  	host_flags |= setup_toshiba_delay > 0 ? FLAG_TOSHIBA_DELAY : 0;
ca513fc94   Finn Thain   atari_NCR5380: In...
485

8053b0ee7   Finn Thain   ncr5380: Merge DM...
486
  	error = NCR5380_init(instance, host_flags | FLAG_LATE_DMA_SETUP);
0ad0eff98   Finn Thain   ncr5380: Introduc...
487
488
  	if (error)
  		goto fail_init;
cbad48deb   Finn Thain   mac_scsi: Convert...
489
490
491
492
493
494
495
  
  	if (instance->irq != NO_IRQ) {
  		error = request_irq(instance->irq, macscsi_intr, IRQF_SHARED,
  		                    "NCR5380", instance);
  		if (error)
  			goto fail_irq;
  	}
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
496
  	NCR5380_maybe_reset_bus(instance);
cbad48deb   Finn Thain   mac_scsi: Convert...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
  	error = scsi_add_host(instance, NULL);
  	if (error)
  		goto fail_host;
  
  	platform_set_drvdata(pdev, instance);
  
  	scsi_scan_host(instance);
  	return 0;
  
  fail_host:
  	if (instance->irq != NO_IRQ)
  		free_irq(instance->irq, instance);
  fail_irq:
  	NCR5380_exit(instance);
0ad0eff98   Finn Thain   ncr5380: Introduc...
511
  fail_init:
cbad48deb   Finn Thain   mac_scsi: Convert...
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
  	scsi_host_put(instance);
  	return error;
  }
  
  static int __exit mac_scsi_remove(struct platform_device *pdev)
  {
  	struct Scsi_Host *instance = platform_get_drvdata(pdev);
  
  	scsi_remove_host(instance);
  	if (instance->irq != NO_IRQ)
  		free_irq(instance->irq, instance);
  	NCR5380_exit(instance);
  	scsi_host_put(instance);
  	return 0;
  }
  
  static struct platform_driver mac_scsi_driver = {
  	.remove = __exit_p(mac_scsi_remove),
  	.driver = {
  		.name	= DRV_MODULE_NAME,
cbad48deb   Finn Thain   mac_scsi: Convert...
532
533
  	},
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
534

cbad48deb   Finn Thain   mac_scsi: Convert...
535
  module_platform_driver_probe(mac_scsi_driver, mac_scsi_probe);
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
536

cbad48deb   Finn Thain   mac_scsi: Convert...
537
  MODULE_ALIAS("platform:" DRV_MODULE_NAME);
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
538
  MODULE_LICENSE("GPL");