Blame view

drivers/scsi/mac_esp.c 11.5 KB
09c434b8a   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /* mac_esp.c: ESP front-end for Macintosh Quadra systems.
   *
   * Adapted from jazz_esp.c and the old mac_esp.c.
   *
   * The pseudo DMA algorithm is based on the one used in NetBSD.
   * See sys/arch/mac68k/obio/esp.c for some background information.
   *
   * Copyright (C) 2007-2008 Finn Thain
   */
  
  #include <linux/kernel.h>
  #include <linux/types.h>
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
  #include <linux/dma-mapping.h>
  #include <linux/scatterlist.h>
  #include <linux/delay.h>
  #include <linux/io.h>
  #include <linux/nubus.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
23
  #include <linux/slab.h>
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
24
25
26
  
  #include <asm/irq.h>
  #include <asm/dma.h>
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
27
28
  #include <asm/macints.h>
  #include <asm/macintosh.h>
30c0527d1   Finn Thain   m68k/mac: cleanup...
29
  #include <asm/mac_via.h>
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  
  #include <scsi/scsi_host.h>
  
  #include "esp_scsi.h"
  
  #define DRV_MODULE_NAME     "mac_esp"
  #define PFX                 DRV_MODULE_NAME ": "
  #define DRV_VERSION         "1.000"
  #define DRV_MODULE_RELDATE  "Sept 15, 2007"
  
  #define MAC_ESP_IO_BASE          0x50F00000
  #define MAC_ESP_REGS_QUADRA      (MAC_ESP_IO_BASE + 0x10000)
  #define MAC_ESP_REGS_QUADRA2     (MAC_ESP_IO_BASE + 0xF000)
  #define MAC_ESP_REGS_QUADRA3     (MAC_ESP_IO_BASE + 0x18000)
  #define MAC_ESP_REGS_SPACING     0x402
  #define MAC_ESP_PDMA_REG         0xF9800024
  #define MAC_ESP_PDMA_REG_SPACING 0x4
  #define MAC_ESP_PDMA_IO_OFFSET   0x100
  
  #define esp_read8(REG)		mac_esp_read8(esp, REG)
  #define esp_write8(VAL, REG)	mac_esp_write8(esp, VAL, REG)
  
  struct mac_esp_priv {
  	struct esp *esp;
  	void __iomem *pdma_regs;
  	void __iomem *pdma_io;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
56
  };
da244654c   Finn Thain   [SCSI] mac_esp: f...
57
  static struct esp *esp_chips[2];
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
58
  static DEFINE_SPINLOCK(esp_chips_lock);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
59
60
  
  #define MAC_ESP_GET_PRIV(esp) ((struct mac_esp_priv *) \
98cda6a2e   Christoph Hellwig   scsi: esp_scsi: u...
61
  			       dev_get_drvdata((esp)->dev))
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
62
63
64
65
66
67
68
69
70
71
  
  static inline void mac_esp_write8(struct esp *esp, u8 val, unsigned long reg)
  {
  	nubus_writeb(val, esp->regs + reg * 16);
  }
  
  static inline u8 mac_esp_read8(struct esp *esp, unsigned long reg)
  {
  	return nubus_readb(esp->regs + reg * 16);
  }
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  static void mac_esp_reset_dma(struct esp *esp)
  {
  	/* Nothing to do. */
  }
  
  static void mac_esp_dma_drain(struct esp *esp)
  {
  	/* Nothing to do. */
  }
  
  static void mac_esp_dma_invalidate(struct esp *esp)
  {
  	/* Nothing to do. */
  }
  
  static int mac_esp_dma_error(struct esp *esp)
  {
53dce332d   Finn Thain   scsi: esp_scsi: D...
89
  	return esp->send_cmd_error;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
90
91
92
93
  }
  
  static inline int mac_esp_wait_for_empty_fifo(struct esp *esp)
  {
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  	int i = 500000;
  
  	do {
  		if (!(esp_read8(ESP_FFLAGS) & ESP_FF_FBYTES))
  			return 0;
  
  		if (esp_read8(ESP_STATUS) & ESP_STAT_INTR)
  			return 1;
  
  		udelay(2);
  	} while (--i);
  
  	printk(KERN_ERR PFX "FIFO is not empty (sreg %02x)
  ",
  	       esp_read8(ESP_STATUS));
53dce332d   Finn Thain   scsi: esp_scsi: D...
109
  	esp->send_cmd_error = 1;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
110
111
112
113
114
115
116
117
118
119
  	return 1;
  }
  
  static inline int mac_esp_wait_for_dreq(struct esp *esp)
  {
  	struct mac_esp_priv *mep = MAC_ESP_GET_PRIV(esp);
  	int i = 500000;
  
  	do {
  		if (mep->pdma_regs == NULL) {
30c0527d1   Finn Thain   m68k/mac: cleanup...
120
  			if (via2_scsi_drq_pending())
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  				return 0;
  		} else {
  			if (nubus_readl(mep->pdma_regs) & 0x200)
  				return 0;
  		}
  
  		if (esp_read8(ESP_STATUS) & ESP_STAT_INTR)
  			return 1;
  
  		udelay(2);
  	} while (--i);
  
  	printk(KERN_ERR PFX "PDMA timeout (sreg %02x)
  ",
  	       esp_read8(ESP_STATUS));
53dce332d   Finn Thain   scsi: esp_scsi: D...
136
  	esp->send_cmd_error = 1;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
137
138
139
140
141
  	return 1;
  }
  
  #define MAC_ESP_PDMA_LOOP(operands) \
  	asm volatile ( \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
142
143
  	     "       tstw %1                   
  " \
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
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
  	     "       jbeq 20f                  
  " \
  	     "1:     movew " operands "        
  " \
  	     "2:     movew " operands "        
  " \
  	     "3:     movew " operands "        
  " \
  	     "4:     movew " operands "        
  " \
  	     "5:     movew " operands "        
  " \
  	     "6:     movew " operands "        
  " \
  	     "7:     movew " operands "        
  " \
  	     "8:     movew " operands "        
  " \
  	     "9:     movew " operands "        
  " \
  	     "10:    movew " operands "        
  " \
  	     "11:    movew " operands "        
  " \
  	     "12:    movew " operands "        
  " \
  	     "13:    movew " operands "        
  " \
  	     "14:    movew " operands "        
  " \
  	     "15:    movew " operands "        
  " \
  	     "16:    movew " operands "        
  " \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
178
179
  	     "       subqw #1,%1               
  " \
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
180
181
  	     "       jbne 1b                   
  " \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
182
183
  	     "20:    tstw %2                   
  " \
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
184
185
186
187
  	     "       jbeq 30f                  
  " \
  	     "21:    movew " operands "        
  " \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
188
189
  	     "       subqw #1,%2               
  " \
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
190
191
  	     "       jbne 21b                  
  " \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
192
193
  	     "30:    tstw %3                   
  " \
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  	     "       jbeq 40f                  
  " \
  	     "31:    moveb " operands "        
  " \
  	     "32:    nop                       
  " \
  	     "40:                              
  " \
  	     "                                 
  " \
  	     "       .section __ex_table,\"a\" 
  " \
  	     "       .align  4                 
  " \
  	     "       .long   1b,40b            
  " \
  	     "       .long   2b,40b            
  " \
  	     "       .long   3b,40b            
  " \
  	     "       .long   4b,40b            
  " \
  	     "       .long   5b,40b            
  " \
  	     "       .long   6b,40b            
  " \
  	     "       .long   7b,40b            
  " \
  	     "       .long   8b,40b            
  " \
  	     "       .long   9b,40b            
  " \
  	     "       .long  10b,40b            
  " \
  	     "       .long  11b,40b            
  " \
  	     "       .long  12b,40b            
  " \
  	     "       .long  13b,40b            
  " \
  	     "       .long  14b,40b            
  " \
  	     "       .long  15b,40b            
  " \
  	     "       .long  16b,40b            
  " \
  	     "       .long  21b,40b            
  " \
  	     "       .long  31b,40b            
  " \
  	     "       .long  32b,40b            
  " \
  	     "       .previous                 
  " \
09e13e916   Finn Thain   [SCSI] m68k: mac_...
248
249
  	     : "+a" (addr), "+r" (count32), "+r" (count2) \
  	     : "g" (count1), "a" (mep->pdma_io))
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
250
251
252
253
254
  
  static void mac_esp_send_pdma_cmd(struct esp *esp, u32 addr, u32 esp_count,
  				  u32 dma_count, int write, u8 cmd)
  {
  	struct mac_esp_priv *mep = MAC_ESP_GET_PRIV(esp);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
255

53dce332d   Finn Thain   scsi: esp_scsi: D...
256
  	esp->send_cmd_error = 0;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
257
258
259
260
261
262
263
264
265
266
267
268
  
  	if (!write)
  		scsi_esp_cmd(esp, ESP_CMD_FLUSH);
  
  	esp_write8((esp_count >> 0) & 0xFF, ESP_TCLOW);
  	esp_write8((esp_count >> 8) & 0xFF, ESP_TCMED);
  
  	scsi_esp_cmd(esp, cmd);
  
  	do {
  		unsigned int count32 = esp_count >> 5;
  		unsigned int count2 = (esp_count & 0x1F) >> 1;
09e13e916   Finn Thain   [SCSI] m68k: mac_...
269
  		unsigned int count1 = esp_count & 1;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
270
271
272
273
274
275
  		unsigned int start_addr = addr;
  
  		if (mac_esp_wait_for_dreq(esp))
  			break;
  
  		if (write) {
09e13e916   Finn Thain   [SCSI] m68k: mac_...
276
  			MAC_ESP_PDMA_LOOP("%4@,%0@+");
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
277
278
279
280
  
  			esp_count -= addr - start_addr;
  		} else {
  			unsigned int n;
09e13e916   Finn Thain   [SCSI] m68k: mac_...
281
  			MAC_ESP_PDMA_LOOP("%0@+,%4@");
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
282
283
284
285
286
287
288
289
290
  
  			if (mac_esp_wait_for_empty_fifo(esp))
  				break;
  
  			n = (esp_read8(ESP_TCMED) << 8) + esp_read8(ESP_TCLOW);
  			addr = start_addr + esp_count - n;
  			esp_count = n;
  		}
  	} while (esp_count);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
291
  }
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
292
293
294
295
296
297
298
299
300
301
302
  static int mac_esp_irq_pending(struct esp *esp)
  {
  	if (esp_read8(ESP_STATUS) & ESP_STAT_INTR)
  		return 1;
  	return 0;
  }
  
  static u32 mac_esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32 dma_len)
  {
  	return dma_len > 0xFFFF ? 0xFFFF : dma_len;
  }
da244654c   Finn Thain   [SCSI] mac_esp: f...
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
  static irqreturn_t mac_scsi_esp_intr(int irq, void *dev_id)
  {
  	int got_intr;
  
  	/*
  	 * This is an edge triggered IRQ, so we have to be careful to
  	 * avoid missing a transition when it is shared by two ESP devices.
  	 */
  
  	do {
  		got_intr = 0;
  		if (esp_chips[0] &&
  		    (mac_esp_read8(esp_chips[0], ESP_STATUS) & ESP_STAT_INTR)) {
  			(void)scsi_esp_intr(irq, esp_chips[0]);
  			got_intr = 1;
  		}
  		if (esp_chips[1] &&
  		    (mac_esp_read8(esp_chips[1], ESP_STATUS) & ESP_STAT_INTR)) {
  			(void)scsi_esp_intr(irq, esp_chips[1]);
  			got_intr = 1;
  		}
  	} while (got_intr);
  
  	return IRQ_HANDLED;
  }
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
328
329
330
  static struct esp_driver_ops mac_esp_ops = {
  	.esp_write8       = mac_esp_write8,
  	.esp_read8        = mac_esp_read8,
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
331
332
333
334
335
336
337
338
  	.irq_pending      = mac_esp_irq_pending,
  	.dma_length_limit = mac_esp_dma_length_limit,
  	.reset_dma        = mac_esp_reset_dma,
  	.dma_drain        = mac_esp_dma_drain,
  	.dma_invalidate   = mac_esp_dma_invalidate,
  	.send_dma_cmd     = mac_esp_send_pdma_cmd,
  	.dma_error        = mac_esp_dma_error,
  };
6f0397905   Greg Kroah-Hartman   Drivers: scsi: re...
339
  static int esp_mac_probe(struct platform_device *dev)
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
340
341
342
343
344
  {
  	struct scsi_host_template *tpnt = &scsi_esp_template;
  	struct Scsi_Host *host;
  	struct esp *esp;
  	int err;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
345
346
347
348
  	struct mac_esp_priv *mep;
  
  	if (!MACH_IS_MAC)
  		return -ENODEV;
cff75f1fb   Finn Thain   mac68k: move mac_...
349
  	if (dev->id > 1)
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
350
351
352
353
354
355
356
357
358
  		return -ENODEV;
  
  	host = scsi_host_alloc(tpnt, sizeof(struct esp));
  
  	err = -ENOMEM;
  	if (!host)
  		goto fail;
  
  	host->max_id = 8;
4af14d113   Christoph Hellwig   scsi: remove the ...
359
  	host->dma_boundary = PAGE_SIZE - 1;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
360
361
362
  	esp = shost_priv(host);
  
  	esp->host = host;
98cda6a2e   Christoph Hellwig   scsi: esp_scsi: u...
363
  	esp->dev = &dev->dev;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
364
365
366
367
368
369
370
371
372
373
374
375
376
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
402
403
404
405
  
  	esp->command_block = kzalloc(16, GFP_KERNEL);
  	if (!esp->command_block)
  		goto fail_unlink;
  	esp->command_block_dma = (dma_addr_t)esp->command_block;
  
  	esp->scsi_id = 7;
  	host->this_id = esp->scsi_id;
  	esp->scsi_id_mask = 1 << esp->scsi_id;
  
  	mep = kzalloc(sizeof(struct mac_esp_priv), GFP_KERNEL);
  	if (!mep)
  		goto fail_free_command_block;
  	mep->esp = esp;
  	platform_set_drvdata(dev, mep);
  
  	switch (macintosh_config->scsi_type) {
  	case MAC_SCSI_QUADRA:
  		esp->cfreq     = 16500000;
  		esp->regs      = (void __iomem *)MAC_ESP_REGS_QUADRA;
  		mep->pdma_io   = esp->regs + MAC_ESP_PDMA_IO_OFFSET;
  		mep->pdma_regs = NULL;
  		break;
  	case MAC_SCSI_QUADRA2:
  		esp->cfreq     = 25000000;
  		esp->regs      = (void __iomem *)(MAC_ESP_REGS_QUADRA2 +
  				 dev->id * MAC_ESP_REGS_SPACING);
  		mep->pdma_io   = esp->regs + MAC_ESP_PDMA_IO_OFFSET;
  		mep->pdma_regs = (void __iomem *)(MAC_ESP_PDMA_REG +
  				 dev->id * MAC_ESP_PDMA_REG_SPACING);
  		nubus_writel(0x1d1, mep->pdma_regs);
  		break;
  	case MAC_SCSI_QUADRA3:
  		/* These quadras have a real DMA controller (the PSC) but we
  		 * don't know how to drive it so we must use PIO instead.
  		 */
  		esp->cfreq     = 25000000;
  		esp->regs      = (void __iomem *)MAC_ESP_REGS_QUADRA3;
  		mep->pdma_io   = NULL;
  		mep->pdma_regs = NULL;
  		break;
  	}
53dce332d   Finn Thain   scsi: esp_scsi: D...
406
  	esp->fifo_reg = esp->regs + ESP_FDATA * 16;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
407
408
  
  	esp->ops = &mac_esp_ops;
3f9295b65   Christoph Hellwig   scsi: esp_scsi: m...
409
  	esp->flags = ESP_FLAG_NO_DMA_MAP;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
410
411
412
413
414
  	if (mep->pdma_io == NULL) {
  		printk(KERN_INFO PFX "using PIO for controller %d
  ", dev->id);
  		esp_write8(0, ESP_TCLOW);
  		esp_write8(0, ESP_TCMED);
3f9295b65   Christoph Hellwig   scsi: esp_scsi: m...
415
  		esp->flags |= ESP_FLAG_DISABLE_SYNC;
53dce332d   Finn Thain   scsi: esp_scsi: D...
416
  		mac_esp_ops.send_dma_cmd = esp_send_pio_cmd;
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
417
418
419
420
421
422
  	} else {
  		printk(KERN_INFO PFX "using PDMA for controller %d
  ", dev->id);
  	}
  
  	host->irq = IRQ_MAC_SCSI;
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
423
424
425
426
427
428
429
430
431
  
  	/* The request_irq() call is intended to succeed for the first device
  	 * and fail for the second device.
  	 */
  	err = request_irq(host->irq, mac_scsi_esp_intr, 0, "ESP", NULL);
  	spin_lock(&esp_chips_lock);
  	if (err < 0 && esp_chips[!dev->id] == NULL) {
  		spin_unlock(&esp_chips_lock);
  		goto fail_free_priv;
da244654c   Finn Thain   [SCSI] mac_esp: f...
432
  	}
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
433
434
  	esp_chips[dev->id] = esp;
  	spin_unlock(&esp_chips_lock);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
435

44b1b4d24   Christoph Hellwig   scsi: esp_scsi: r...
436
  	err = scsi_esp_register(esp);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
437
438
439
440
441
442
  	if (err)
  		goto fail_free_irq;
  
  	return 0;
  
  fail_free_irq:
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
443
444
445
446
  	spin_lock(&esp_chips_lock);
  	esp_chips[dev->id] = NULL;
  	if (esp_chips[!dev->id] == NULL) {
  		spin_unlock(&esp_chips_lock);
c0e3a6acd   Wei Yongjun   scsi: mac_esp: fi...
447
  		free_irq(host->irq, NULL);
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
448
449
  	} else
  		spin_unlock(&esp_chips_lock);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
450
451
452
453
454
455
456
457
458
  fail_free_priv:
  	kfree(mep);
  fail_free_command_block:
  	kfree(esp->command_block);
  fail_unlink:
  	scsi_host_put(host);
  fail:
  	return err;
  }
6f0397905   Greg Kroah-Hartman   Drivers: scsi: re...
459
  static int esp_mac_remove(struct platform_device *dev)
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
460
461
462
463
464
465
  {
  	struct mac_esp_priv *mep = platform_get_drvdata(dev);
  	struct esp *esp = mep->esp;
  	unsigned int irq = esp->host->irq;
  
  	scsi_esp_unregister(esp);
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
466
  	spin_lock(&esp_chips_lock);
da244654c   Finn Thain   [SCSI] mac_esp: f...
467
  	esp_chips[dev->id] = NULL;
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
468
469
  	if (esp_chips[!dev->id] == NULL) {
  		spin_unlock(&esp_chips_lock);
da244654c   Finn Thain   [SCSI] mac_esp: f...
470
  		free_irq(irq, NULL);
4da2b1eb2   Finn Thain   scsi: mac_esp: Re...
471
472
  	} else
  		spin_unlock(&esp_chips_lock);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
473
474
475
476
477
478
479
480
481
482
483
484
  
  	kfree(mep);
  
  	kfree(esp->command_block);
  
  	scsi_host_put(esp->host);
  
  	return 0;
  }
  
  static struct platform_driver esp_mac_driver = {
  	.probe    = esp_mac_probe,
6f0397905   Greg Kroah-Hartman   Drivers: scsi: re...
485
  	.remove   = esp_mac_remove,
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
486
  	.driver   = {
cff75f1fb   Finn Thain   mac68k: move mac_...
487
  		.name	= DRV_MODULE_NAME,
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
488
489
  	},
  };
d30fbf2ce   Liu Shixin   scsi: mac_esp: Us...
490
  module_platform_driver(esp_mac_driver);
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
491
492
  
  MODULE_DESCRIPTION("Mac ESP SCSI driver");
d0c2c269a   Finn Thain   drivers: Clean up...
493
  MODULE_AUTHOR("Finn Thain");
839cd3105   Al Viro   MODULE_LICENSE ex...
494
  MODULE_LICENSE("GPL v2");
6fe07aaff   Finn Thain   [SCSI] m68k: new ...
495
  MODULE_VERSION(DRV_VERSION);
cff75f1fb   Finn Thain   mac68k: move mac_...
496
  MODULE_ALIAS("platform:" DRV_MODULE_NAME);