mac_esp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * 68k mac 53c9[46] scsi driver
  3.  *
  4.  * copyright (c) 1998, David Weis weisd3458@uni.edu
  5.  *
  6.  * debugging on Quadra 800 and 660AV Michael Schmitz, Dave Kilzer 7/98
  7.  *
  8.  * based loosely on cyber_esp.c
  9.  */
  10. /* these are unused for now */
  11. #define myreadl(addr) (*(volatile unsigned int *) (addr))
  12. #define mywritel(b, addr) ((*(volatile unsigned int *) (addr)) = (b))
  13. #include <linux/kernel.h>
  14. #include <linux/delay.h>
  15. #include <linux/types.h>
  16. #include <linux/ctype.h>
  17. #include <linux/string.h>
  18. #include <linux/slab.h>
  19. #include <linux/blk.h>
  20. #include <linux/proc_fs.h>
  21. #include <linux/stat.h>
  22. #include <linux/init.h>
  23. #include "scsi.h"
  24. #include "hosts.h"
  25. #include "NCR53C9x.h"
  26. #include "mac_esp.h"
  27. #include <asm/io.h>
  28. #include <asm/setup.h>
  29. #include <asm/irq.h>
  30. #include <asm/macints.h>
  31. #include <asm/machw.h>
  32. #include <asm/mac_via.h>
  33. #include <asm/pgtable.h>
  34. #include <asm/macintosh.h>
  35. #define mac_turnon_irq(x) mac_enable_irq(x)
  36. #define mac_turnoff_irq(x) mac_disable_irq(x)
  37. extern inline void esp_handle(struct NCR_ESP *esp);
  38. extern void mac_esp_intr(int irq, void *dev_id, struct pt_regs *pregs);
  39. static int  dma_bytes_sent(struct NCR_ESP * esp, int fifo_count);
  40. static int  dma_can_transfer(struct NCR_ESP * esp, Scsi_Cmnd *sp);
  41. static void dma_dump_state(struct NCR_ESP * esp);
  42. static void dma_init_read(struct NCR_ESP * esp, char * vaddress, int length);
  43. static void dma_init_write(struct NCR_ESP * esp, char * vaddress, int length);
  44. static void dma_ints_off(struct NCR_ESP * esp);
  45. static void dma_ints_on(struct NCR_ESP * esp);
  46. static int  dma_irq_p(struct NCR_ESP * esp);
  47. static int  dma_irq_p_quick(struct NCR_ESP * esp);
  48. static void dma_led_off(struct NCR_ESP * esp);
  49. static void dma_led_on(struct NCR_ESP *esp);
  50. static int  dma_ports_p(struct NCR_ESP *esp);
  51. static void dma_setup(struct NCR_ESP * esp, __u32 addr, int count, int write);
  52. static void dma_setup_quick(struct NCR_ESP * esp, __u32 addr, int count, int write);
  53. static int esp_dafb_dma_irq_p(struct NCR_ESP * espdev);
  54. static int esp_iosb_dma_irq_p(struct NCR_ESP * espdev);
  55. static volatile unsigned char cmd_buffer[16];
  56. /* This is where all commands are put
  57.  * before they are transferred to the ESP chip
  58.  * via PIO.
  59.  */
  60. static int esp_initialized = 0;
  61. static int setup_num_esps = -1;
  62. static int setup_disconnect = -1;
  63. static int setup_nosync = -1;
  64. static int setup_can_queue = -1;
  65. static int setup_cmd_per_lun = -1;
  66. static int setup_sg_tablesize = -1;
  67. #ifdef SUPPORT_TAGS
  68. static int setup_use_tagged_queuing = -1;
  69. #endif
  70. static int setup_hostid = -1;
  71. /*
  72.  * Experimental ESP inthandler; check macints.c to make sure dev_id is 
  73.  * set up properly!
  74.  */
  75. void mac_esp_intr(int irq, void *dev_id, struct pt_regs *pregs)
  76. {
  77. struct NCR_ESP *esp = (struct NCR_ESP *) dev_id;
  78. int irq_p = 0;
  79. /* Handle the one ESP interrupt showing at this IRQ level. */
  80. if(((esp)->irq & 0xff) == irq) {
  81. /*
  82.  * Debug ..
  83.  */
  84. irq_p = esp->dma_irq_p(esp);
  85.   printk("mac_esp: irq_p %x current %p disconnected %pn",
  86.   irq_p, esp->current_SC, esp->disconnected_SC);
  87.  
  88. /*
  89.  * Mac: if we're here, it's an ESP interrupt for sure!
  90.  */
  91. if((esp->current_SC || esp->disconnected_SC)) {
  92. esp->dma_ints_off(esp);
  93. ESPIRQ(("I%d(", esp->esp_id));
  94. esp_handle(esp);
  95. ESPIRQ((")"));
  96. esp->dma_ints_on(esp);
  97. }
  98. }
  99. }
  100. /*
  101.  * Debug hooks; use for playing with the interrupt flag testing and interrupt
  102.  * acknowledge on the various machines
  103.  */
  104. void scsi_esp_polled(int irq, void *dev_id, struct pt_regs *pregs)
  105. {
  106. if (esp_initialized == 0)
  107. return;
  108. mac_esp_intr(irq, dev_id, pregs);
  109. }
  110. void fake_intr(int irq, void *dev_id, struct pt_regs *pregs)
  111. {
  112. #ifdef DEBUG_MAC_ESP
  113. printk("mac_esp: got irqn");
  114. #endif
  115. mac_esp_intr(irq, dev_id, pregs);
  116. }
  117. void fake_drq(int irq, void *dev_id, struct pt_regs *pregs)
  118. {
  119. printk("mac_esp: got drqn");
  120. }
  121. #define DRIVER_SETUP
  122. /*
  123.  * Function : mac_esp_setup(char *str, int *ints)
  124.  *
  125.  * Purpose : booter command line initialization of the overrides array,
  126.  *
  127.  * Inputs : str - unused, ints - array of integer parameters with ints[0]
  128.  * equal to the number of ints.
  129.  *
  130.  * Currently unused in the new driver; need to add settable parameters to the 
  131.  * detect function.
  132.  *
  133.  */
  134. static int __init mac_esp_setup(char *str, int *ints) {
  135. #ifdef DRIVER_SETUP
  136. /* Format of mac53c9x parameter is:
  137.  *   mac53c9x=<num_esps>,<disconnect>,<nosync>,<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
  138.  * Negative values mean don't change.
  139.  */
  140. /* Grmbl... the standard parameter parsing can't handle negative numbers
  141.  * :-( So let's do it ourselves!
  142.  */
  143. int i = ints[0]+1, fact;
  144. while( str && (isdigit(*str) || *str == '-') && i <= 10) {
  145. if (*str == '-')
  146. fact = -1, ++str;
  147. else
  148. fact = 1;
  149. ints[i++] = simple_strtoul( str, NULL, 0 ) * fact;
  150. if ((str = strchr( str, ',' )) != NULL)
  151. ++str;
  152. }
  153. ints[0] = i-1;
  154. if (ints[0] < 1) {
  155. printk( "mac_esp_setup: no arguments!n" );
  156. return 0;
  157. }
  158. if (ints[0] >= 1) {
  159. if (ints[1] > 0)
  160. /* no limits on this, just > 0 */
  161. if (ints[1] >= 0 && ints[1] <= 2)
  162. setup_num_esps = ints[1];
  163. else if (ints[1] > 2)
  164. printk( "mac_esp_setup: invalid number of hosts %d !n", ints[1] );
  165. }
  166. if (ints[0] >= 2) {
  167. if (ints[2] > 0)
  168. setup_disconnect = ints[2];
  169. }
  170. if (ints[0] >= 3) {
  171. if (ints[3] >= 0) {
  172. setup_nosync = ints[3];
  173. }
  174. }
  175. if (ints[0] >= 4) {
  176. if (ints[4] > 0)
  177. /* no limits on this, just > 0 */
  178. setup_can_queue = ints[4];
  179. }
  180. if (ints[0] >= 5) {
  181. if (ints[5] > 0)
  182. setup_cmd_per_lun = ints[5];
  183. }
  184. if (ints[0] >= 6) {
  185. if (ints[6] >= 0) {
  186. setup_sg_tablesize = ints[6];
  187. /* Must be <= SG_ALL (255) */
  188. if (setup_sg_tablesize > SG_ALL)
  189. setup_sg_tablesize = SG_ALL;
  190. }
  191. }
  192. if (ints[0] >= 7) {
  193. /* Must be between 0 and 7 */
  194. if (ints[7] >= 0 && ints[7] <= 7)
  195. setup_hostid = ints[7];
  196. else if (ints[7] > 7)
  197. printk( "mac_esp_setup: invalid host ID %d !n", ints[7] );
  198. }
  199. #ifdef SUPPORT_TAGS
  200. if (ints[0] >= 8) {
  201. if (ints[8] >= 0)
  202. setup_use_tagged_queuing = !!ints[8];
  203. }
  204. #endif
  205. #endif
  206. return 1; 
  207. }
  208. __setup("mac53c9x=", mac_esp_setup);
  209. /*
  210.  * ESP address 'detection'
  211.  */
  212. unsigned long get_base(int chip_num)
  213. {
  214. /*
  215.  * using the chip_num and mac model, figure out where the
  216.  * chips are mapped
  217.  */
  218. unsigned long io_base = 0x50f00000;
  219. unsigned int second_offset = 0x402;
  220. unsigned long scsi_loc = 0;
  221. switch (macintosh_config->scsi_type) {
  222. /* 950, 900, 700 */
  223. case MAC_SCSI_QUADRA2:
  224. scsi_loc =  io_base + 0xf000 + ((chip_num == 0) ? 0 : second_offset);
  225. break;
  226. /* av's */
  227. case MAC_SCSI_QUADRA3:
  228. scsi_loc = io_base + 0x18000 + ((chip_num == 0) ? 0 : second_offset);
  229. break;
  230. /* most quadra/centris models are like this */
  231. case MAC_SCSI_QUADRA:
  232. scsi_loc = io_base + 0x10000;
  233. break;
  234. default:
  235. printk("mac_esp: get_base: hit default!n");
  236. scsi_loc = io_base + 0x10000;
  237. break;
  238. } /* switch */
  239. printk("mac_esp: io base at 0x%lxn", scsi_loc);
  240. return scsi_loc;
  241. }
  242. /*
  243.  * Model dependent ESP setup
  244.  */
  245. int mac_esp_detect(Scsi_Host_Template * tpnt)
  246. {
  247. int quick = 0;
  248. int chipnum, chipspresent = 0;
  249. #if 0
  250. unsigned long timeout;
  251. #endif
  252. if (esp_initialized > 0)
  253. return -ENODEV;
  254. /* what do we have in this machine... */
  255. if (MACHW_PRESENT(MAC_SCSI_96)) {
  256. chipspresent ++;
  257. }
  258. if (MACHW_PRESENT(MAC_SCSI_96_2)) {
  259. chipspresent ++;
  260. }
  261. /* number of ESPs present ? */
  262. if (setup_num_esps >= 0) {
  263.   if (chipspresent >= setup_num_esps)
  264.     chipspresent = setup_num_esps;
  265.   else
  266.     printk("mac_esp_detect: num_hosts detected %d setup %d n",
  267.    chipspresent, setup_num_esps);
  268. }
  269. /* TODO: add disconnect / nosync flags */
  270. /* setup variables */
  271. tpnt->can_queue =
  272.   (setup_can_queue > 0) ? setup_can_queue : 7;
  273. tpnt->cmd_per_lun =
  274.   (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : 1;
  275. tpnt->sg_tablesize = 
  276.   (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_ALL;
  277. if (setup_hostid >= 0)
  278.   tpnt->this_id = setup_hostid;
  279. else {
  280.   /* use 7 as default */
  281.   tpnt->this_id = 7;
  282. }
  283. #ifdef SUPPORT_TAGS
  284. if (setup_use_tagged_queuing < 0)
  285. setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
  286. #endif
  287. for (chipnum = 0; chipnum < chipspresent; chipnum ++) {
  288. struct NCR_ESP * esp;
  289. esp = esp_allocate(tpnt, (void *) NULL);
  290. esp->eregs = (struct ESP_regs *) get_base(chipnum);
  291. esp->dma_irq_p = &esp_dafb_dma_irq_p;
  292. if (chipnum == 0) {
  293. if (macintosh_config->scsi_type == MAC_SCSI_QUADRA) {
  294. /* most machines except those below :-) */
  295. quick = 1;
  296. esp->dma_irq_p = &esp_iosb_dma_irq_p;
  297. } else if (macintosh_config->scsi_type == MAC_SCSI_QUADRA3) {
  298. /* mostly av's */
  299. quick = 0;
  300. } else {
  301. /* q950, 900, 700 */
  302. quick = 1;
  303. out_be32(0xf9800024, 0x1d1);
  304. esp->dregs = (void *) 0xf9800024;
  305. }
  306. } else { /* chipnum */
  307. quick = 1;
  308. out_be32(0xf9800028, 0x1d1);
  309. esp->dregs = (void *) 0xf9800028;
  310. } /* chipnum == 0 */
  311. /* use pio for command bytes; pio for message/data: TBI */
  312. esp->do_pio_cmds = 1;
  313. /* Set the command buffer */
  314. esp->esp_command = (volatile unsigned char*) cmd_buffer;
  315. esp->esp_command_dvma = (__u32) cmd_buffer;
  316. /* various functions */
  317. esp->dma_bytes_sent = &dma_bytes_sent;
  318. esp->dma_can_transfer = &dma_can_transfer;
  319. esp->dma_dump_state = &dma_dump_state;
  320. esp->dma_init_read = NULL;
  321. esp->dma_init_write = NULL;
  322. esp->dma_ints_off = &dma_ints_off;
  323. esp->dma_ints_on = &dma_ints_on;
  324. esp->dma_ports_p = &dma_ports_p;
  325. /* Optional functions */
  326. esp->dma_barrier = NULL;
  327. esp->dma_drain = NULL;
  328. esp->dma_invalidate = NULL;
  329. esp->dma_irq_entry = NULL;
  330. esp->dma_irq_exit = NULL;
  331. esp->dma_led_on = NULL;
  332. esp->dma_led_off = NULL;
  333. esp->dma_poll = NULL;
  334. esp->dma_reset = NULL;
  335. /* SCSI chip speed */
  336. /* below esp->cfreq = 40000000; */
  337. if (quick) {
  338. /* 'quick' means there's handshake glue logic like in the 5380 case */
  339. esp->dma_setup = &dma_setup_quick;
  340. } else {
  341. esp->dma_setup = &dma_setup;
  342. }
  343. if (chipnum == 0) {
  344. esp->irq = IRQ_MAC_SCSI;
  345. request_irq(IRQ_MAC_SCSI, esp_intr, 0, "Mac ESP SCSI", esp);
  346. #if 0 /* conflicts with IOP ADB */
  347. request_irq(IRQ_MAC_SCSIDRQ, fake_drq, 0, "Mac ESP DRQ", esp);
  348. #endif
  349. if (macintosh_config->scsi_type == MAC_SCSI_QUADRA) {
  350. esp->cfreq = 16500000;
  351. } else {
  352. esp->cfreq = 25000000;
  353. }
  354. } else { /* chipnum == 1 */
  355. esp->irq = IRQ_MAC_SCSIDRQ;
  356. #if 0 /* conflicts with IOP ADB */
  357. request_irq(IRQ_MAC_SCSIDRQ, esp_intr, 0, "Mac ESP SCSI 2", esp);
  358. #endif
  359. esp->cfreq = 25000000;
  360. }
  361. if (quick) {
  362. printk("esp: using quick versionn");
  363. }
  364. printk("esp: addr at 0x%pn", esp->eregs);
  365. esp->scsi_id = 7;
  366. esp->diff = 0;
  367. esp_initialize(esp);
  368. } /* for chipnum */
  369. if (chipspresent)
  370. printk("nmac_esp: %d esp controllers foundn", chipspresent);
  371. esp_initialized = chipspresent;
  372. return chipspresent;
  373. }
  374. /*
  375.  * I've been wondering what this is supposed to do, for some time. Talking 
  376.  * to Allen Briggs: These machines have an extra register someplace where the
  377.  * DRQ pin of the ESP can be monitored. That isn't useful for determining 
  378.  * anything else (such as reselect interrupt or other magic) though. 
  379.  * Maybe make the semantics should be changed like 
  380.  * if (esp->current_SC)
  381.  * ... check DRQ flag ...
  382.  * else 
  383.  * ... disconnected, check pending VIA interrupt ...
  384.  *
  385.  * There's a problem with using the dabf flag or mac_irq_pending() here: both
  386.  * seem to return 1 even though no interrupt is currently pending, resulting
  387.  * in esp_exec_cmd() holding off the next command, and possibly infinite loops
  388.  * in esp_intr(). 
  389.  * Short term fix: just use esp_status & ESP_STAT_INTR here, as long as we
  390.  * use simple PIO. The DRQ status will be important when implementing pseudo
  391.  * DMA mode (set up ESP transfer count, return, do a batch of bytes in PIO or 
  392.  * 'hardware handshake' mode upon DRQ).
  393.  * If you plan on changing this (i.e. to save the esp_status register access in 
  394.  * favor of a VIA register access or a shadow register for the IFR), make sure
  395.  * to try a debug version of this first to monitor what registers would be a good
  396.  * indicator of the ESP interrupt.
  397.  */
  398. static int esp_dafb_dma_irq_p(struct NCR_ESP * esp)
  399. {
  400. unsigned int ret;
  401. int sreg = esp_read(esp->eregs->esp_status);
  402. #ifdef DEBUG_MAC_ESP
  403. printk("mac_esp: esp_dafb_dma_irq_p dafb %d irq %dn", 
  404. readl(esp->dregs), mac_irq_pending(IRQ_MAC_SCSI));
  405. #endif
  406. sreg &= ESP_STAT_INTR;
  407. /*
  408.  * maybe working; this is essentially what's used for iosb_dma_irq_p
  409.  */
  410. if (sreg)
  411. return 1;
  412. else
  413. return 0;
  414. /*
  415.  * didn't work ...
  416.  */
  417. #if 0
  418. if (esp->current_SC)
  419. ret = readl(esp->dregs) & 0x200;
  420. else if (esp->disconnected_SC)
  421. ret = 1; /* sreg ?? */
  422. else
  423. ret = mac_irq_pending(IRQ_MAC_SCSI);
  424. return(ret);
  425. #endif
  426. }
  427. /*
  428.  * See above: testing mac_irq_pending always returned 8 (SCSI IRQ) regardless 
  429.  * of the actual ESP status.
  430.  */
  431. static int esp_iosb_dma_irq_p(struct NCR_ESP * esp)
  432. {
  433. int ret  = mac_irq_pending(IRQ_MAC_SCSI) || mac_irq_pending(IRQ_MAC_SCSIDRQ);
  434. int sreg = esp_read(esp->eregs->esp_status);
  435. #ifdef DEBUG_MAC_ESP
  436. printk("mac_esp: dma_irq_p drq %d irq %d sreg %x curr %p disc %pn", 
  437. mac_irq_pending(IRQ_MAC_SCSIDRQ), mac_irq_pending(IRQ_MAC_SCSI), 
  438. sreg, esp->current_SC, esp->disconnected_SC);
  439. #endif
  440. sreg &= ESP_STAT_INTR;
  441. if (sreg)
  442. return (sreg);
  443. else
  444. return 0;
  445. }
  446. /*
  447.  * This seems to be OK for PIO at least ... usually 0 after PIO.
  448.  */
  449. static int dma_bytes_sent(struct NCR_ESP * esp, int fifo_count)
  450. {
  451. #ifdef DEBUG_MAC_ESP
  452. printk("mac_esp: dma bytes sent = %xn", fifo_count);
  453. #endif
  454. return fifo_count;
  455. }
  456. /*
  457.  * dma_can_transfer is used to switch between DMA and PIO, if DMA (pseudo)
  458.  * is ever implemented. Returning 0 here will use PIO.
  459.  */
  460. static int dma_can_transfer(struct NCR_ESP * esp, Scsi_Cmnd * sp)
  461. {
  462. unsigned long sz = sp->SCp.this_residual;
  463. #if 0 /* no DMA yet; make conditional */
  464. if (sz > 0x10000000) {
  465. sz = 0x10000000;
  466. }
  467. printk("mac_esp: dma can transfer = 0lx%xn", sz);
  468. #else
  469. #ifdef DEBUG_MAC_ESP
  470. printk("mac_esp: pio to transfer = %ldn", sz);
  471. #endif
  472. sz = 0;
  473. #endif
  474. return sz;
  475. }
  476. /*
  477.  * Not yet ...
  478.  */
  479. static void dma_dump_state(struct NCR_ESP * esp)
  480. {
  481. #ifdef DEBUG_MAC_ESP
  482. printk("mac_esp: dma_dump_state: calledn");
  483. #endif
  484. #if 0
  485. ESPLOG(("esp%d: dma -- cond_reg<%02x>n",
  486. esp->esp_id, ((struct mac_dma_registers *)
  487. (esp->dregs))->cond_reg));
  488. #endif
  489. }
  490. /*
  491.  * DMA setup: should be used to set up the ESP transfer count for pseudo
  492.  * DMA transfers; need a DRQ transfer function to do the actual transfer
  493.  */
  494. static void dma_init_read(struct NCR_ESP * esp, char * vaddress, int length)
  495. {
  496. printk("mac_esp: dma_init_readn");
  497. }
  498. static void dma_init_write(struct NCR_ESP * esp, char * vaddress, int length)
  499. {
  500. printk("mac_esp: dma_init_writen");
  501. }
  502. static void dma_ints_off(struct NCR_ESP * esp)
  503. {
  504. mac_turnoff_irq(esp->irq);
  505. }
  506. static void dma_ints_on(struct NCR_ESP * esp)
  507. {
  508. mac_turnon_irq(esp->irq);
  509. }
  510. /*
  511.  * generic dma_irq_p(), unused
  512.  */
  513. static int dma_irq_p(struct NCR_ESP * esp)
  514. {
  515. int i = esp_read(esp->eregs->esp_status);
  516. #ifdef DEBUG_MAC_ESP
  517. printk("mac_esp: dma_irq_p status %dn", i);
  518. #endif
  519. return (i & ESP_STAT_INTR);
  520. }
  521. static int dma_irq_p_quick(struct NCR_ESP * esp)
  522. {
  523. /*
  524.  * Copied from iosb_dma_irq_p()
  525.  */
  526. int ret  = mac_irq_pending(IRQ_MAC_SCSI) || mac_irq_pending(IRQ_MAC_SCSIDRQ);
  527. int sreg = esp_read(esp->eregs->esp_status);
  528. #ifdef DEBUG_MAC_ESP
  529. printk("mac_esp: dma_irq_p drq %d irq %d sreg %x curr %p disc %pn", 
  530. mac_irq_pending(IRQ_MAC_SCSIDRQ), mac_irq_pending(IRQ_MAC_SCSI), 
  531. sreg, esp->current_SC, esp->disconnected_SC);
  532. #endif
  533. sreg &= ESP_STAT_INTR;
  534. if (sreg)
  535. return (sreg);
  536. else
  537. return 0;
  538. }
  539. static void dma_led_off(struct NCR_ESP * esp)
  540. {
  541. #ifdef DEBUG_MAC_ESP
  542. printk("mac_esp: dma_led_off: calledn");
  543. #endif
  544. }
  545. static void dma_led_on(struct NCR_ESP * esp)
  546. {
  547. #ifdef DEBUG_MAC_ESP
  548. printk("mac_esp: dma_led_on: calledn");
  549. #endif
  550. }
  551. static int dma_ports_p(struct NCR_ESP * esp)
  552. {
  553. return 0;
  554. }
  555. static void dma_setup(struct NCR_ESP * esp, __u32 addr, int count, int write)
  556. {
  557. #ifdef DEBUG_MAC_ESP
  558. printk("mac_esp: dma_setupn");
  559. #endif
  560. if (write) {
  561. dma_init_read(esp, (char *) addr, count);
  562. } else {
  563. dma_init_write(esp, (char *) addr, count);
  564. }
  565. }
  566. static void dma_setup_quick(struct NCR_ESP * esp, __u32 addr, int count, int write)
  567. {
  568. #ifdef DEBUG_MAC_ESP
  569. printk("mac_esp: dma_setup_quickn");
  570. #endif
  571. }
  572. static Scsi_Host_Template driver_template = SCSI_MAC_ESP;
  573. #include "scsi_module.c"
  574. MODULE_LICENSE("GPL");