Blame view

drivers/scsi/mac_scsi.c 11.6 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

e744fdea5   Boaz Harrosh   scsi_mac.h: Defin...
30
  #define PSEUDO_DMA
cbad48deb   Finn Thain   mac_scsi: Convert...
31
  #define NCR5380_implementation_fields   unsigned char *pdma_base
92de38315   Finn Thain   mac_scsi: Remove ...
32

54d8fe442   Finn Thain   ncr5380: Remove N...
33
34
  #define NCR5380_read(reg)               macscsi_read(instance, reg)
  #define NCR5380_write(reg, value)       macscsi_write(instance, reg, value)
92de38315   Finn Thain   mac_scsi: Remove ...
35
36
37
  
  #define NCR5380_pread                   macscsi_pread
  #define NCR5380_pwrite                  macscsi_pwrite
ff3d45788   Finn Thain   ncr5380: Implemen...
38
  #define NCR5380_dma_xfer_len(instance, cmd, phase)	(cmd->transfersize)
92de38315   Finn Thain   mac_scsi: Remove ...
39
40
41
42
43
44
45
46
  
  #define NCR5380_intr                    macscsi_intr
  #define NCR5380_queue_command           macscsi_queue_command
  #define NCR5380_abort                   macscsi_abort
  #define NCR5380_bus_reset               macscsi_bus_reset
  #define NCR5380_info                    macscsi_info
  #define NCR5380_show_info               macscsi_show_info
  #define NCR5380_write_info              macscsi_write_info
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  #include "NCR5380.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  static int setup_can_queue = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
49
  module_param(setup_can_queue, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  static int setup_cmd_per_lun = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
51
  module_param(setup_cmd_per_lun, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  static int setup_sg_tablesize = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
53
  module_param(setup_sg_tablesize, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  static int setup_use_pdma = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
55
  module_param(setup_use_pdma, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
  static int setup_use_tagged_queuing = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
57
  module_param(setup_use_tagged_queuing, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  static int setup_hostid = -1;
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
59
  module_param(setup_hostid, int, 0);
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
60
61
  static int setup_toshiba_delay = -1;
  module_param(setup_toshiba_delay, int, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
  /*
   * NCR 5380 register access functions
   */
cbad48deb   Finn Thain   mac_scsi: Convert...
66
  static inline char macscsi_read(struct Scsi_Host *instance, int reg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  {
cbad48deb   Finn Thain   mac_scsi: Convert...
68
  	return in_8(instance->base + (reg << 4));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
  }
cbad48deb   Finn Thain   mac_scsi: Convert...
70
  static inline void macscsi_write(struct Scsi_Host *instance, int reg, int value)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  {
cbad48deb   Finn Thain   mac_scsi: Convert...
72
  	out_8(instance->base + (reg << 4), value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74

6e9ae6d56   Finn Thain   mac_scsi: Add mod...
75
76
77
  #ifndef MODULE
  static int __init mac_scsi_setup(char *str)
  {
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
78
  	int ints[8];
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
79
80
  
  	(void)get_options(str, ARRAY_SIZE(ints), ints);
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
81
82
83
  	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...
84
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
  	}
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
86
87
88
89
90
91
92
93
94
95
96
  	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];
  	if (ints[0] >= 5)
  		setup_use_tagged_queuing = ints[5];
  	if (ints[0] >= 6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  		setup_use_pdma = ints[6];
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
98
99
  	if (ints[0] >= 7)
  		setup_toshiba_delay = ints[7];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
  	return 1;
  }
  
  __setup("mac5380=", mac_scsi_setup);
6e9ae6d56   Finn Thain   mac_scsi: Add mod...
104
  #endif /* !MODULE */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105

ffdede67d   Finn Thain   mac_scsi: Cleanup...
106
  #ifdef PSEUDO_DMA
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
109
110
111
112
113
  /* 
     Pseudo-DMA: (Ove Edlund)
     The code attempts to catch bus errors that occur if one for example
     "trips over the cable".
     XXX: Since bus errors in the PDMA routines never happen on my 
     computer, the bus error code is untested. 
     If the code works as intended, a bus error results in Pseudo-DMA 
542cb4593   Finn Thain   scsi: Fix "choir"...
114
     being disabled, meaning that the driver switches to slow handshake.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
     If bus errors are NOT extremely rare, this has to be changed. 
  */
  
  #define CP_IO_TO_MEM(s,d,len)				\
  __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
  "					\
       "90: moveq.l #1, %2
  "				\
       "    jra 9b
  "					\
       ".previous
  "					\
       ".section __ex_table,\"a\"
  "			\
       "   .align 4
  "					\
       "   .long  1b,90b
  "				\
       "   .long  3b,90b
  "				\
       "   .long 31b,90b
  "				\
       "   .long 32b,90b
  "				\
       "   .long 33b,90b
  "				\
       "   .long 34b,90b
  "				\
       "   .long 35b,90b
  "				\
       "   .long 36b,90b
  "				\
       "   .long 37b,90b
  "				\
       "   .long  5b,90b
  "				\
       "   .long  7b,90b
  "				\
       ".previous"					\
       : "=a"(s), "=a"(d), "=d"(len)			\
       : "0"(s), "1"(d), "2"(len)				\
       : "d0")
ffdede67d   Finn Thain   mac_scsi: Cleanup...
226
227
  static int macscsi_pread(struct Scsi_Host *instance,
                           unsigned char *dst, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
  {
cbad48deb   Finn Thain   mac_scsi: Convert...
229
  	struct NCR5380_hostdata *hostdata = shost_priv(instance);
ffdede67d   Finn Thain   mac_scsi: Cleanup...
230
231
  	unsigned char *d;
  	unsigned char *s;
cbad48deb   Finn Thain   mac_scsi: Convert...
232
  	s = hostdata->pdma_base + (INPUT_DATA_REG << 4);
ffdede67d   Finn Thain   mac_scsi: Cleanup...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
  	d = dst;
  
  	/* These conditions are derived from MacOS */
  
  	while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
  	       !(NCR5380_read(STATUS_REG) & SR_REQ))
  		;
  
  	if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
  	    (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
  		pr_err("Error in macscsi_pread
  ");
  		return -1;
  	}
  
  	CP_IO_TO_MEM(s, d, len);
  
  	if (len != 0) {
  		pr_notice("Bus error in macscsi_pread
  ");
  		return -1;
  	}
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
  }
  
  
  #define CP_MEM_TO_IO(s,d,len)				\
  __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
  "					\
       "90: moveq.l #1, %2
  "				\
       "    jra 9b
  "					\
       ".previous
  "					\
       ".section __ex_table,\"a\"
  "			\
       "   .align 4
  "					\
       "   .long  1b,90b
  "				\
       "   .long  3b,90b
  "				\
       "   .long 31b,90b
  "				\
       "   .long 32b,90b
  "				\
       "   .long 33b,90b
  "				\
       "   .long 34b,90b
  "				\
       "   .long 35b,90b
  "				\
       "   .long 36b,90b
  "				\
       "   .long 37b,90b
  "				\
       "   .long  5b,90b
  "				\
       "   .long  7b,90b
  "				\
       ".previous"					\
       : "=a"(s), "=a"(d), "=d"(len)			\
       : "0"(s), "1"(d), "2"(len)				\
       : "d0")
ffdede67d   Finn Thain   mac_scsi: Cleanup...
368
369
  static int macscsi_pwrite(struct Scsi_Host *instance,
                            unsigned char *src, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370
  {
cbad48deb   Finn Thain   mac_scsi: Convert...
371
  	struct NCR5380_hostdata *hostdata = shost_priv(instance);
ffdede67d   Finn Thain   mac_scsi: Cleanup...
372
373
  	unsigned char *s;
  	unsigned char *d;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374

ffdede67d   Finn Thain   mac_scsi: Cleanup...
375
  	s = src;
cbad48deb   Finn Thain   mac_scsi: Convert...
376
  	d = hostdata->pdma_base + (OUTPUT_DATA_REG << 4);
ffdede67d   Finn Thain   mac_scsi: Cleanup...
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
  
  	/* These conditions are derived from MacOS */
  
  	while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
  	       (!(NCR5380_read(STATUS_REG) & SR_REQ) ||
  	        (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
  		;
  
  	if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
  		pr_err("Error in macscsi_pwrite
  ");
  		return -1;
  	}
  
  	CP_MEM_TO_IO(s, d, len);
  
  	if (len != 0) {
  		pr_notice("Bus error in macscsi_pwrite
  ");
  		return -1;
  	}
  
  	return 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
  #include "NCR5380.c"
cbad48deb   Finn Thain   mac_scsi: Convert...
404
405
406
407
  #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 ...
408
409
410
411
412
413
414
415
416
417
418
419
420
421
  	.module			= THIS_MODULE,
  	.proc_name		= DRV_MODULE_NAME,
  	.show_info		= macscsi_show_info,
  	.write_info		= macscsi_write_info,
  	.name			= "Macintosh NCR5380 SCSI",
  	.info			= macscsi_info,
  	.queuecommand		= macscsi_queue_command,
  	.eh_abort_handler	= macscsi_abort,
  	.eh_bus_reset_handler	= macscsi_bus_reset,
  	.can_queue		= 16,
  	.this_id		= 7,
  	.sg_tablesize		= SG_ALL,
  	.cmd_per_lun		= 2,
  	.use_clustering		= DISABLE_CLUSTERING,
32b26a104   Finn Thain   ncr5380: Use stan...
422
  	.cmd_size		= NCR5380_CMD_SIZE,
0a4e36125   Finn Thain   ncr5380: Fix soft...
423
  	.max_sectors		= 128,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
  };
cbad48deb   Finn Thain   mac_scsi: Convert...
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
  static int __init mac_scsi_probe(struct platform_device *pdev)
  {
  	struct Scsi_Host *instance;
  	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;
  
  #ifdef PSEUDO_DMA
  	pdma_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
  #endif
  
  	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...
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
  	if (setup_use_pdma < 0)
  		setup_use_pdma = 0;
  
  	instance = scsi_host_alloc(&mac_scsi_template,
  	                           sizeof(struct NCR5380_hostdata));
  	if (!instance)
  		return -ENOMEM;
  
  	instance->base = pio_mem->start;
  	if (irq)
  		instance->irq = irq->start;
  	else
  		instance->irq = NO_IRQ;
  
  	if (pdma_mem && setup_use_pdma) {
  		struct NCR5380_hostdata *hostdata = shost_priv(instance);
  
  		hostdata->pdma_base = (unsigned char *)pdma_mem->start;
  	} else
  		host_flags |= FLAG_NO_PSEUDO_DMA;
ca513fc94   Finn Thain   atari_NCR5380: In...
477
478
479
  #ifdef SUPPORT_TAGS
  	host_flags |= setup_use_tagged_queuing > 0 ? FLAG_TAGGED_QUEUING : 0;
  #endif
9c3f0e2b5   Finn Thain   atari_NCR5380: Re...
480
  	host_flags |= setup_toshiba_delay > 0 ? FLAG_TOSHIBA_DELAY : 0;
ca513fc94   Finn Thain   atari_NCR5380: In...
481

0ad0eff98   Finn Thain   ncr5380: Introduc...
482
483
484
  	error = NCR5380_init(instance, host_flags);
  	if (error)
  		goto fail_init;
cbad48deb   Finn Thain   mac_scsi: Convert...
485
486
487
488
489
490
491
  
  	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...
492
  	NCR5380_maybe_reset_bus(instance);
cbad48deb   Finn Thain   mac_scsi: Convert...
493
494
495
496
497
498
499
500
501
502
503
504
505
506
  	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...
507
  fail_init:
cbad48deb   Finn Thain   mac_scsi: Convert...
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
  	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...
528
529
  	},
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530

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

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