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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * acsi.c -- Device driver for Atari ACSI hard disks
  3.  *
  4.  * Copyright 1994 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
  5.  *
  6.  * Some parts are based on hd.c by Linus Torvalds
  7.  *
  8.  * This file is subject to the terms and conditions of the GNU General Public
  9.  * License.  See the file COPYING in the main directory of this archive for
  10.  * more details.
  11.  *
  12.  */
  13. /*
  14.  * Still to in this file:
  15.  *  - If a command ends with an error status (!= 0), the following
  16.  *    REQUEST SENSE commands (4 to fill the ST-DMA FIFO) are done by
  17.  *    polling the _IRQ signal (not interrupt-driven). This should be
  18.  *    avoided in future because it takes up a non-neglectible time in
  19.  *    the interrupt service routine while interrupts are disabled.
  20.  *    Maybe a timer interrupt will get lost :-(
  21.  */
  22. /*
  23.  * General notes:
  24.  *
  25.  *  - All ACSI devices (disks, CD-ROMs, ...) use major number 28.
  26.  *    Minors are organized like it is with SCSI: The upper 4 bits
  27.  *    identify the device, the lower 4 bits the partition.
  28.  *    The device numbers (the upper 4 bits) are given in the same
  29.  *    order as the devices are found on the bus.
  30.  *  - Up to 8 LUNs are supported for each target (if CONFIG_ACSI_MULTI_LUN
  31.  *    is defined), but only a total of 16 devices (due to minor
  32.  *    numbers...). Note that Atari allows only a maximum of 4 targets
  33.  *    (i.e. controllers, not devices) on the ACSI bus!
  34.  *  - A optimizing scheme similar to SCSI scatter-gather is implemented.
  35.  *  - Removable media are supported. After a medium change to device
  36.  *    is reinitialized (partition check etc.). Also, if the device
  37.  *    knows the PREVENT/ALLOW MEDIUM REMOVAL command, the door should
  38.  *    be locked and unlocked when mounting the first or unmounting the
  39.  *    last filesystem on the device. The code is untested, because I
  40.  *    don't have a removable hard disk.
  41.  *
  42.  */
  43. #define MAJOR_NR ACSI_MAJOR
  44. #include <linux/config.h>
  45. #include <linux/module.h>
  46. #include <linux/errno.h>
  47. #include <linux/signal.h>
  48. #include <linux/sched.h>
  49. #include <linux/timer.h>
  50. #include <linux/fs.h>
  51. #include <linux/kernel.h>
  52. #include <linux/genhd.h>
  53. #include <linux/devfs_fs_kernel.h>
  54. #include <linux/delay.h>
  55. #include <linux/mm.h>
  56. #include <linux/major.h>
  57. #include <linux/blk.h>
  58. #include <linux/slab.h>
  59. #include <linux/interrupt.h>
  60. #include <scsi/scsi.h> /* for SCSI_IOCTL_GET_IDLUN */
  61. typedef void Scsi_Device; /* hack to avoid including scsi.h */
  62. #include <scsi/scsi_ioctl.h>
  63. #include <linux/hdreg.h> /* for HDIO_GETGEO */
  64. #include <linux/blkpg.h>
  65. #include <asm/setup.h>
  66. #include <asm/pgtable.h>
  67. #include <asm/system.h>
  68. #include <asm/uaccess.h>
  69. #include <asm/atarihw.h>
  70. #include <asm/atariints.h>
  71. #include <asm/atari_acsi.h>
  72. #include <asm/atari_stdma.h>
  73. #include <asm/atari_stram.h>
  74. #define DEBUG
  75. #undef DEBUG_DETECT
  76. #undef NO_WRITE
  77. #define MAX_ERRORS      8 /* Max read/write errors/sector */
  78. #define MAX_LUN 8 /* Max LUNs per target */
  79. #define MAX_DEV     16
  80. #define ACSI_BUFFER_SIZE (16*1024) /* "normal" ACSI buffer size */
  81. #define ACSI_BUFFER_MINSIZE (2048)    /* min. buf size if ext. DMA */
  82. #define ACSI_BUFFER_SIZE_ORDER   2   /* order size for above */
  83. #define ACSI_BUFFER_MINSIZE_ORDER 0       /* order size for above */
  84. #define ACSI_BUFFER_SECTORS (ACSI_BUFFER_SIZE/512)
  85. #define ACSI_BUFFER_ORDER 
  86. (ATARIHW_PRESENT(EXTD_DMA) ? 
  87.  ACSI_BUFFER_MINSIZE_ORDER : 
  88.  ACSI_BUFFER_SIZE_ORDER)
  89. #define ACSI_TIMEOUT (4*HZ)
  90. /* minimum delay between two commands */
  91. #define COMMAND_DELAY 500
  92. typedef enum {
  93. NONE, HARDDISK, CDROM
  94. } ACSI_TYPE;
  95. struct acsi_info_struct {
  96. ACSI_TYPE type; /* type of device */
  97. unsigned target; /* target number */
  98. unsigned lun; /* LUN in target controller */
  99. unsigned removable : 1; /* Flag for removable media */
  100. unsigned read_only : 1; /* Flag for read only devices */
  101. unsigned old_atari_disk : 1; /* Is an old Atari disk       */
  102. unsigned changed : 1; /* Medium has been changed */
  103. unsigned long  size; /* #blocks */
  104. } acsi_info[MAX_DEV];
  105. /*
  106.  * SENSE KEYS
  107.  */
  108. #define NO_SENSE 0x00
  109. #define RECOVERED_ERROR  0x01
  110. #define NOT_READY 0x02
  111. #define MEDIUM_ERROR 0x03
  112. #define HARDWARE_ERROR 0x04
  113. #define ILLEGAL_REQUEST  0x05
  114. #define UNIT_ATTENTION 0x06
  115. #define DATA_PROTECT 0x07
  116. #define BLANK_CHECK 0x08
  117. #define COPY_ABORTED 0x0a
  118. #define ABORTED_COMMAND  0x0b
  119. #define VOLUME_OVERFLOW  0x0d
  120. #define MISCOMPARE 0x0e
  121. /*
  122.  * DEVICE TYPES
  123.  */
  124. #define TYPE_DISK 0x00
  125. #define TYPE_TAPE 0x01
  126. #define TYPE_WORM 0x04
  127. #define TYPE_ROM 0x05
  128. #define TYPE_MOD 0x07
  129. #define TYPE_NO_LUN 0x7f
  130. /* The data returned by MODE SENSE differ between the old Atari
  131.  * hard disks and SCSI disks connected to ACSI. In the following, both
  132.  * formats are defined and some macros to operate on them potably.
  133.  */
  134. typedef struct {
  135. unsigned long dummy[2];
  136. unsigned long sector_size;
  137. unsigned char format_code;
  138. #define ATARI_SENSE_FORMAT_FIX 1
  139. #define ATARI_SENSE_FORMAT_CHNG 2
  140. unsigned char cylinders_h;
  141. unsigned char cylinders_l;
  142. unsigned char heads;
  143. unsigned char reduced_h;
  144. unsigned char reduced_l;
  145. unsigned char precomp_h;
  146. unsigned char precomp_l;
  147. unsigned char landing_zone;
  148. unsigned char steprate;
  149. unsigned char type;
  150. #define ATARI_SENSE_TYPE_FIXCHNG_MASK 4
  151. #define ATARI_SENSE_TYPE_SOFTHARD_MASK 8
  152. #define ATARI_SENSE_TYPE_FIX 4
  153. #define ATARI_SENSE_TYPE_CHNG 0
  154. #define ATARI_SENSE_TYPE_SOFT 0
  155. #define ATARI_SENSE_TYPE_HARD 8
  156. unsigned char sectors;
  157. } ATARI_SENSE_DATA;
  158. #define ATARI_CAPACITY(sd) 
  159. (((int)((sd).cylinders_h<<8)|(sd).cylinders_l) * 
  160.  (sd).heads * (sd).sectors)
  161. typedef struct {
  162. unsigned char   dummy1;
  163. unsigned char   medium_type;
  164. unsigned char   dummy2;
  165. unsigned char   descriptor_size;
  166. unsigned long   block_count;
  167. unsigned long   sector_size;
  168. /* Page 0 data */
  169. unsigned char page_code;
  170. unsigned char page_size;
  171. unsigned char page_flags;
  172. unsigned char qualifier;
  173. } SCSI_SENSE_DATA;
  174. #define SCSI_CAPACITY(sd)  ((sd).block_count & 0xffffff)
  175. typedef union {
  176. ATARI_SENSE_DATA atari;
  177. SCSI_SENSE_DATA scsi;
  178. } SENSE_DATA;
  179. #define SENSE_TYPE_UNKNOWN 0
  180. #define SENSE_TYPE_ATARI 1
  181. #define SENSE_TYPE_SCSI 2
  182. #define SENSE_TYPE(sd)
  183. (((sd).atari.dummy[0] == 8 &&
  184.   ((sd).atari.format_code == 1 ||
  185.    (sd).atari.format_code == 2)) ? SENSE_TYPE_ATARI :
  186.  ((sd).scsi.dummy1 >= 11) ? SENSE_TYPE_SCSI :
  187.  SENSE_TYPE_UNKNOWN)
  188.  
  189. #define CAPACITY(sd)
  190. (SENSE_TYPE(sd) == SENSE_TYPE_ATARI ?
  191.  ATARI_CAPACITY((sd).atari) :
  192.  SCSI_CAPACITY((sd).scsi))
  193. #define SECTOR_SIZE(sd)
  194. (SENSE_TYPE(sd) == SENSE_TYPE_ATARI ?
  195.  (sd).atari.sector_size :
  196.  (sd).scsi.sector_size & 0xffffff)
  197. /* Default size if capacity cannot be determined (1 GByte) */
  198. #define DEFAULT_SIZE 0x1fffff
  199. #define CARTRCH_STAT(dev,buf)
  200. (acsi_info[(dev)].old_atari_disk ?
  201.  (((buf)[0] & 0x7f) == 0x28) :
  202.  ((((buf)[0] & 0x70) == 0x70) ?
  203.   (((buf)[2] & 0x0f) == 0x06) :
  204.   (((buf)[0] & 0x0f) == 0x06)))
  205. /* These two are also exported to other drivers that work on the ACSI bus and
  206.  * need an ST-RAM buffer. */
  207. char  *acsi_buffer;
  208. unsigned long  phys_acsi_buffer;
  209. static int NDevices = 0;
  210. static int acsi_sizes[MAX_DEV<<4] = { 0, };
  211. static int acsi_blocksizes[MAX_DEV<<4] = { 0, };
  212. static struct hd_struct acsi_part[MAX_DEV<<4] = { {0,0}, };
  213. static int  access_count[MAX_DEV] = { 0, };
  214. static char  busy[MAX_DEV] = { 0, };
  215. static DECLARE_WAIT_QUEUE_HEAD(busy_wait);
  216. static int CurrentNReq;
  217. static int CurrentNSect;
  218. static char *CurrentBuffer;
  219. #define SET_TIMER() mod_timer(&acsi_timer, jiffies + ACSI_TIMEOUT)
  220. #define CLEAR_TIMER() del_timer(&acsi_timer)
  221. static unsigned long STramMask;
  222. #define STRAM_ADDR(a) (((a) & STramMask) == 0)
  223. /* ACSI commands */
  224. static char tur_cmd[6]        = { 0x00, 0, 0, 0, 0, 0 };
  225. static char modesense_cmd[6]  = { 0x1a, 0, 0, 0, 24, 0 };
  226. static char modeselect_cmd[6] = { 0x15, 0, 0, 0, 12, 0 };
  227. static char inquiry_cmd[6]    = { 0x12, 0, 0, 0,255, 0 };
  228. static char reqsense_cmd[6]   = { 0x03, 0, 0, 0, 4, 0 };
  229. static char read_cmd[6]       = { 0x08, 0, 0, 0, 0, 0 };
  230. static char write_cmd[6]      = { 0x0a, 0, 0, 0, 0, 0 };
  231. static char pa_med_rem_cmd[6] = { 0x1e, 0, 0, 0, 0, 0 };
  232. #define CMDSET_TARG_LUN(cmd,targ,lun)
  233.     do {
  234. cmd[0] = (cmd[0] & ~0xe0) | (targ)<<5;
  235. cmd[1] = (cmd[1] & ~0xe0) | (lun)<<5;
  236. } while(0)
  237. #define CMDSET_BLOCK(cmd,blk)
  238.     do {
  239. unsigned long __blk = (blk);
  240. cmd[3] = __blk; __blk >>= 8;
  241. cmd[2] = __blk; __blk >>= 8;
  242. cmd[1] = (cmd[1] & 0xe0) | (__blk & 0x1f);
  243. } while(0)
  244. #define CMDSET_LEN(cmd,len)
  245. do {
  246. cmd[4] = (len);
  247. } while(0)
  248. /* ACSI errors (from REQUEST SENSE); There are two tables, one for the
  249.  * old Atari disks and one for SCSI on ACSI disks.
  250.  */
  251. struct acsi_error {
  252. unsigned char code;
  253. const char *text;
  254. } atari_acsi_errors[] = {
  255. { 0x00, "No error (??)" },
  256. { 0x01, "No index pulses" },
  257. { 0x02, "Seek not complete" },
  258. { 0x03, "Write fault" },
  259. { 0x04, "Drive not ready" },
  260. { 0x06, "No Track 00 signal" },
  261. { 0x10, "ECC error in ID field" },
  262. { 0x11, "Uncorrectable data error" },
  263. { 0x12, "ID field address mark not found" },
  264. { 0x13, "Data field address mark not found" },
  265. { 0x14, "Record not found" },
  266. { 0x15, "Seek error" },
  267. { 0x18, "Data check in no retry mode" },
  268. { 0x19, "ECC error during verify" },
  269. { 0x1a, "Access to bad block" },
  270. { 0x1c, "Unformatted or bad format" },
  271. { 0x20, "Invalid command" },
  272. { 0x21, "Invalid block address" },
  273. { 0x23, "Volume overflow" },
  274. { 0x24, "Invalid argument" },
  275. { 0x25, "Invalid drive number" },
  276. { 0x26, "Byte zero parity check" },
  277. { 0x28, "Cartride changed" },
  278. { 0x2c, "Error count overflow" },
  279. { 0x30, "Controller selftest failed" }
  280. },
  281. scsi_acsi_errors[] = {
  282. { 0x00, "No error (??)" },
  283. { 0x01, "Recovered error" },
  284. { 0x02, "Drive not ready" },
  285. { 0x03, "Uncorrectable medium error" },
  286. { 0x04, "Hardware error" },
  287. { 0x05, "Illegal request" },
  288. { 0x06, "Unit attention (Reset or cartridge changed)" },
  289. { 0x07, "Data protection" },
  290. { 0x08, "Blank check" },
  291. { 0x0b, "Aborted Command" },
  292. { 0x0d, "Volume overflow" }
  293. };
  294. /***************************** Prototypes *****************************/
  295. static int acsicmd_dma( const char *cmd, char *buffer, int blocks, int
  296.                         rwflag, int enable);
  297. static int acsi_reqsense( char *buffer, int targ, int lun);
  298. static void acsi_print_error( const unsigned char *errblk, int dev );
  299. static void acsi_interrupt (int irq, void *data, struct pt_regs *fp);
  300. static void unexpected_acsi_interrupt( void );
  301. static void bad_rw_intr( void );
  302. static void read_intr( void );
  303. static void write_intr( void);
  304. static void acsi_times_out( unsigned long dummy );
  305. static void copy_to_acsibuffer( void );
  306. static void copy_from_acsibuffer( void );
  307. static void do_end_requests( void );
  308. static void do_acsi_request( request_queue_t * );
  309. static void redo_acsi_request( void );
  310. static int acsi_ioctl( struct inode *inode, struct file *file, unsigned int
  311.                        cmd, unsigned long arg );
  312. static int acsi_open( struct inode * inode, struct file * filp );
  313. static int acsi_release( struct inode * inode, struct file * file );
  314. static void acsi_prevent_removal( int target, int flag );
  315. static int acsi_change_blk_size( int target, int lun);
  316. static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd );
  317. static void acsi_geninit(void);
  318. static int revalidate_acsidisk( int dev, int maxusage );
  319. static int acsi_revalidate (dev_t);
  320. /************************* End of Prototypes **************************/
  321. struct timer_list acsi_timer = {
  322.     function: acsi_times_out
  323. };
  324. #ifdef CONFIG_ATARI_SLM
  325. extern int attach_slm( int target, int lun );
  326. extern int slm_init( void );
  327. #endif
  328. /***********************************************************************
  329.  *
  330.  *   ACSI primitives
  331.  *
  332.  **********************************************************************/
  333. /*
  334.  * The following two functions wait for _IRQ to become Low or High,
  335.  * resp., with a timeout. The 'timeout' parameter is in jiffies
  336.  * (10ms).
  337.  * If the functions are called with timer interrupts on (int level <
  338.  * 6), the timeout is based on the 'jiffies' variable to provide exact
  339.  * timeouts for device probing etc.
  340.  * If interrupts are disabled, the number of tries is based on the
  341.  * 'loops_per_jiffy' variable. A rough estimation is sufficient here...
  342.  */
  343. #define INT_LEVEL
  344. ({ unsigned __sr;
  345. __asm__ __volatile__ ( "movew %/sr,%0" : "=dm" (__sr) );
  346. (__sr >> 8) & 7;
  347. })
  348. int acsi_wait_for_IRQ( unsigned timeout )
  349. {
  350. if (INT_LEVEL < 6) {
  351. unsigned long maxjif = jiffies + timeout;
  352. while (time_before(jiffies, maxjif))
  353. if (!(mfp.par_dt_reg & 0x20)) return( 1 );
  354. }
  355. else {
  356. long tries = loops_per_jiffy / 8 * timeout;
  357. while( --tries >= 0 )
  358. if (!(mfp.par_dt_reg & 0x20)) return( 1 );
  359. }
  360. return( 0 ); /* timeout! */
  361. }
  362. int acsi_wait_for_noIRQ( unsigned timeout )
  363. {
  364. if (INT_LEVEL < 6) {
  365. unsigned long maxjif = jiffies + timeout;
  366. while (time_before(jiffies, maxjif))
  367. if (mfp.par_dt_reg & 0x20) return( 1 );
  368. }
  369. else {
  370. long tries = loops_per_jiffy * timeout / 8;
  371. while( tries-- >= 0 )
  372. if (mfp.par_dt_reg & 0x20) return( 1 );
  373. }
  374. return( 0 ); /* timeout! */
  375. }
  376. static struct timeval start_time;
  377. void
  378. acsi_delay_start(void)
  379. {
  380. do_gettimeofday(&start_time);
  381. }
  382. /* wait from acsi_delay_start to now usec (<1E6) usec */
  383. void
  384. acsi_delay_end(long usec)
  385. {
  386. struct timeval end_time;
  387. long deltau,deltas;
  388. do_gettimeofday(&end_time);
  389. deltau=end_time.tv_usec - start_time.tv_usec;
  390. deltas=end_time.tv_sec - start_time.tv_sec;
  391. if (deltas > 1 || deltas < 0)
  392. return;
  393. if (deltas > 0)
  394. deltau += 1000*1000;
  395. if (deltau >= usec)
  396. return;
  397. udelay(usec-deltau);
  398. }
  399. /* acsicmd_dma() sends an ACSI command and sets up the DMA to transfer
  400.  * 'blocks' blocks of 512 bytes from/to 'buffer'.
  401.  * Because the _IRQ signal is used for handshaking the command bytes,
  402.  * the ACSI interrupt has to be disabled in this function. If the end
  403.  * of the operation should be signalled by a real interrupt, it has to be
  404.  * reenabled afterwards.
  405.  */
  406. static int acsicmd_dma( const char *cmd, char *buffer, int blocks, int rwflag, int enable)
  407. { unsigned long flags, paddr;
  408. int i;
  409. #ifdef NO_WRITE
  410. if (rwflag || *cmd == 0x0a) {
  411. printk( "ACSI: Write commands disabled!n" );
  412. return( 0 );
  413. }
  414. #endif
  415. rwflag = rwflag ? 0x100 : 0;
  416. paddr = virt_to_phys( buffer );
  417. acsi_delay_end(COMMAND_DELAY);
  418. DISABLE_IRQ();
  419. save_flags(flags);  
  420. cli();
  421. /* Low on A1 */
  422. dma_wd.dma_mode_status = 0x88 | rwflag;
  423. MFPDELAY();
  424. /* set DMA address */
  425. dma_wd.dma_lo = (unsigned char)paddr;
  426. paddr >>= 8;
  427. MFPDELAY();
  428. dma_wd.dma_md = (unsigned char)paddr;
  429. paddr >>= 8;
  430. MFPDELAY();
  431. if (ATARIHW_PRESENT(EXTD_DMA))
  432. st_dma_ext_dmahi = (unsigned short)paddr;
  433. else
  434. dma_wd.dma_hi = (unsigned char)paddr;
  435. MFPDELAY();
  436. restore_flags(flags);
  437. /* send the command bytes except the last */
  438. for( i = 0; i < 5; ++i ) {
  439. DMA_LONG_WRITE( *cmd++, 0x8a | rwflag );
  440. udelay(20);
  441. if (!acsi_wait_for_IRQ( HZ/2 )) return( 0 ); /* timeout */
  442. }
  443. /* Clear FIFO and switch DMA to correct direction */  
  444. dma_wd.dma_mode_status = 0x92 | (rwflag ^ 0x100);  
  445. MFPDELAY();
  446. dma_wd.dma_mode_status = 0x92 | rwflag;
  447. MFPDELAY();
  448. /* How many sectors for DMA */
  449. dma_wd.fdc_acces_seccount = blocks;
  450. MFPDELAY();
  451. /* send last command byte */
  452. dma_wd.dma_mode_status = 0x8a | rwflag;
  453. MFPDELAY();
  454. DMA_LONG_WRITE( *cmd++, 0x0a | rwflag );
  455. if (enable)
  456. ENABLE_IRQ();
  457. udelay(80);
  458. return( 1 );
  459. }
  460. /*
  461.  * acsicmd_nodma() sends an ACSI command that requires no DMA.
  462.  */
  463. int acsicmd_nodma( const char *cmd, int enable)
  464. { int i;
  465. acsi_delay_end(COMMAND_DELAY);
  466. DISABLE_IRQ();
  467. /* send first command byte */
  468. dma_wd.dma_mode_status = 0x88;
  469. MFPDELAY();
  470. DMA_LONG_WRITE( *cmd++, 0x8a );
  471. udelay(20);
  472. if (!acsi_wait_for_IRQ( HZ/2 )) return( 0 ); /* timeout */
  473. /* send the intermediate command bytes */
  474. for( i = 0; i < 4; ++i ) {
  475. DMA_LONG_WRITE( *cmd++, 0x8a );
  476. udelay(20);
  477. if (!acsi_wait_for_IRQ( HZ/2 )) return( 0 ); /* timeout */
  478. }
  479. /* send last command byte */
  480. DMA_LONG_WRITE( *cmd++, 0x0a );
  481. if (enable)
  482. ENABLE_IRQ();
  483. udelay(80);
  484. return( 1 );
  485. /* Note that the ACSI interrupt is still disabled after this
  486.  * function. If you want to get the IRQ delivered, enable it manually!
  487.  */
  488. }
  489. static int acsi_reqsense( char *buffer, int targ, int lun)
  490. {
  491. CMDSET_TARG_LUN( reqsense_cmd, targ, lun);
  492. if (!acsicmd_dma( reqsense_cmd, buffer, 1, 0, 0 )) return( 0 );
  493. if (!acsi_wait_for_IRQ( 10 )) return( 0 );
  494. acsi_getstatus();
  495. if (!acsicmd_nodma( reqsense_cmd, 0 )) return( 0 );
  496. if (!acsi_wait_for_IRQ( 10 )) return( 0 );
  497. acsi_getstatus();
  498. if (!acsicmd_nodma( reqsense_cmd, 0 )) return( 0 );
  499. if (!acsi_wait_for_IRQ( 10 )) return( 0 );
  500. acsi_getstatus();
  501. if (!acsicmd_nodma( reqsense_cmd, 0 )) return( 0 );
  502. if (!acsi_wait_for_IRQ( 10 )) return( 0 );
  503. acsi_getstatus();
  504. dma_cache_maintenance( virt_to_phys(buffer), 16, 0 );
  505. return( 1 );
  506. }
  507. /*
  508.  * ACSI status phase: get the status byte from the bus
  509.  *
  510.  * I've seen several times that a 0xff status is read, propably due to
  511.  * a timing error. In this case, the procedure is repeated after the
  512.  * next _IRQ edge.
  513.  */
  514. int acsi_getstatus( void )
  515. { int status;
  516. DISABLE_IRQ();
  517. for(;;) {
  518. if (!acsi_wait_for_IRQ( 100 )) {
  519. acsi_delay_start();
  520. return( -1 );
  521. }
  522. dma_wd.dma_mode_status = 0x8a;
  523. MFPDELAY();
  524. status = dma_wd.fdc_acces_seccount;
  525. if (status != 0xff) break;
  526. #ifdef DEBUG
  527. printk("ACSI: skipping 0xff status byten" );
  528. #endif
  529. udelay(40);
  530. acsi_wait_for_noIRQ( 20 );
  531. }
  532. dma_wd.dma_mode_status = 0x80;
  533. udelay(40);
  534. acsi_wait_for_noIRQ( 20 );
  535. acsi_delay_start();
  536. return( status & 0x1f ); /* mask of the device# */
  537. }
  538. #if (defined(CONFIG_ATARI_SLM) || defined(CONFIG_ATARI_SLM_MODULE))
  539. /* Receive data in an extended status phase. Needed by SLM printer. */
  540. int acsi_extstatus( char *buffer, int cnt )
  541. { int status;
  542. DISABLE_IRQ();
  543. udelay(80);
  544. while( cnt-- > 0 ) {
  545. if (!acsi_wait_for_IRQ( 40 )) return( 0 );
  546. dma_wd.dma_mode_status = 0x8a;
  547. MFPDELAY();
  548. status = dma_wd.fdc_acces_seccount;
  549. MFPDELAY();
  550. *buffer++ = status & 0xff;
  551. udelay(40);
  552. }
  553. return( 1 );
  554. }
  555. /* Finish an extended status phase */
  556. void acsi_end_extstatus( void )
  557. {
  558. dma_wd.dma_mode_status = 0x80;
  559. udelay(40);
  560. acsi_wait_for_noIRQ( 20 );
  561. acsi_delay_start();
  562. }
  563. /* Send data in an extended command phase */
  564. int acsi_extcmd( unsigned char *buffer, int cnt )
  565. {
  566. while( cnt-- > 0 ) {
  567. DMA_LONG_WRITE( *buffer++, 0x8a );
  568. udelay(20);
  569. if (!acsi_wait_for_IRQ( HZ/2 )) return( 0 ); /* timeout */
  570. }
  571. return( 1 );
  572. }
  573. #endif
  574. static void acsi_print_error( const unsigned char *errblk, int dev  )
  575. { int atari_err, i, errcode;
  576. struct acsi_error *arr;
  577. atari_err = acsi_info[dev].old_atari_disk;
  578. if (atari_err)
  579. errcode = errblk[0] & 0x7f;
  580. else
  581. if ((errblk[0] & 0x70) == 0x70)
  582. errcode = errblk[2] & 0x0f;
  583. else
  584. errcode = errblk[0] & 0x0f;
  585. printk( KERN_ERR "ACSI error 0x%02x", errcode );
  586. if (errblk[0] & 0x80)
  587. printk( " for sector %d",
  588. ((errblk[1] & 0x1f) << 16) |
  589. (errblk[2] << 8) | errblk[0] );
  590. arr = atari_err ? atari_acsi_errors : scsi_acsi_errors;
  591. i = atari_err ? sizeof(atari_acsi_errors)/sizeof(*atari_acsi_errors) :
  592.             sizeof(scsi_acsi_errors)/sizeof(*scsi_acsi_errors);
  593. for( --i; i >= 0; --i )
  594. if (arr[i].code == errcode) break;
  595. if (i >= 0)
  596. printk( ": %sn", arr[i].text );
  597. }
  598. /*******************************************************************
  599.  *
  600.  * ACSI interrupt routine
  601.  *   Test, if this is a ACSI interrupt and call the irq handler
  602.  *   Otherwise ignore this interrupt.
  603.  *
  604.  *******************************************************************/
  605. static void acsi_interrupt(int irq, void *data, struct pt_regs *fp )
  606. { void (*acsi_irq_handler)(void) = DEVICE_INTR;
  607. DEVICE_INTR = NULL;
  608. CLEAR_TIMER();
  609. if (!acsi_irq_handler)
  610. acsi_irq_handler = unexpected_acsi_interrupt;
  611. acsi_irq_handler();
  612. }
  613. /******************************************************************
  614.  *
  615.  * The Interrupt handlers
  616.  *
  617.  *******************************************************************/
  618. static void unexpected_acsi_interrupt( void )
  619. {
  620. printk( KERN_WARNING "Unexpected ACSI interruptn" );
  621. }
  622. /* This function is called in case of errors. Because we cannot reset
  623.  * the ACSI bus or a single device, there is no other choice than
  624.  * retrying several times :-(
  625.  */
  626. static void bad_rw_intr( void )
  627. {
  628. if (QUEUE_EMPTY)
  629. return;
  630. if (++CURRENT->errors >= MAX_ERRORS)
  631. end_request(0);
  632. /* Otherwise just retry */
  633. }
  634. static void read_intr( void )
  635. { int status;
  636. status = acsi_getstatus();
  637. if (status != 0) {
  638. int dev = DEVICE_NR(MINOR(CURRENT->rq_dev));
  639. printk( KERN_ERR "ad%c: ", dev+'a' );
  640. if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target, 
  641. acsi_info[dev].lun))
  642. printk( "ACSI error and REQUEST SENSE failed (status=0x%02x)n", status );
  643. else {
  644. acsi_print_error( acsi_buffer, dev );
  645. if (CARTRCH_STAT( dev, acsi_buffer ))
  646. acsi_info[dev].changed = 1;
  647. }
  648. ENABLE_IRQ();
  649. bad_rw_intr();
  650. redo_acsi_request();
  651. return;
  652. }
  653. dma_cache_maintenance( virt_to_phys(CurrentBuffer), CurrentNSect*512, 0 );
  654. if (CurrentBuffer == acsi_buffer)
  655. copy_from_acsibuffer();
  656. do_end_requests();
  657. redo_acsi_request();
  658. }
  659. static void write_intr(void)
  660. { int status;
  661. status = acsi_getstatus();
  662. if (status != 0) {
  663. int dev = DEVICE_NR(MINOR(CURRENT->rq_dev));
  664. printk( KERN_ERR "ad%c: ", dev+'a' );
  665. if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target,
  666. acsi_info[dev].lun))
  667. printk( "ACSI error and REQUEST SENSE failed (status=0x%02x)n", status );
  668. else {
  669. acsi_print_error( acsi_buffer, dev );
  670. if (CARTRCH_STAT( dev, acsi_buffer ))
  671. acsi_info[dev].changed = 1;
  672. }
  673. bad_rw_intr();
  674. redo_acsi_request();
  675. return;
  676. }
  677. do_end_requests();
  678. redo_acsi_request();
  679. }
  680. static void acsi_times_out( unsigned long dummy )
  681. {
  682. DISABLE_IRQ();
  683. if (!DEVICE_INTR) return;
  684. DEVICE_INTR = NULL;
  685. printk( KERN_ERR "ACSI timeoutn" );
  686. if (QUEUE_EMPTY) return;
  687. if (++CURRENT->errors >= MAX_ERRORS) {
  688. #ifdef DEBUG
  689. printk( KERN_ERR "ACSI: too many errors.n" );
  690. #endif
  691. end_request(0);
  692. }
  693. redo_acsi_request();
  694. }
  695. /***********************************************************************
  696.  *
  697.  *  Scatter-gather utility functions
  698.  *
  699.  ***********************************************************************/
  700. static void copy_to_acsibuffer( void )
  701. { int i;
  702. char *src, *dst;
  703. struct buffer_head *bh;
  704. src = CURRENT->buffer;
  705. dst = acsi_buffer;
  706. bh = CURRENT->bh;
  707. if (!bh)
  708. memcpy( dst, src, CurrentNSect*512 );
  709. else
  710. for( i = 0; i < CurrentNReq; ++i ) {
  711. memcpy( dst, src, bh->b_size );
  712. dst += bh->b_size;
  713. if ((bh = bh->b_reqnext))
  714. src = bh->b_data;
  715. }
  716. }
  717. static void copy_from_acsibuffer( void )
  718. { int i;
  719. char *src, *dst;
  720. struct buffer_head *bh;
  721. dst = CURRENT->buffer;
  722. src = acsi_buffer;
  723. bh = CURRENT->bh;
  724. if (!bh)
  725. memcpy( dst, src, CurrentNSect*512 );
  726. else
  727. for( i = 0; i < CurrentNReq; ++i ) {
  728. memcpy( dst, src, bh->b_size );
  729. src += bh->b_size;
  730. if ((bh = bh->b_reqnext))
  731. dst = bh->b_data;
  732. }
  733. }
  734. static void do_end_requests( void )
  735. { int i, n;
  736. if (!CURRENT->bh) {
  737. CURRENT->nr_sectors -= CurrentNSect;
  738. CURRENT->current_nr_sectors -= CurrentNSect;
  739. CURRENT->sector += CurrentNSect;
  740. if (CURRENT->nr_sectors == 0)
  741. end_request(1);
  742. }
  743. else {
  744. for( i = 0; i < CurrentNReq; ++i ) {
  745. n = CURRENT->bh->b_size >> 9;
  746. CURRENT->nr_sectors -= n;
  747. CURRENT->current_nr_sectors -= n;
  748. CURRENT->sector += n;
  749. end_request(1);
  750. }
  751. }
  752. }
  753. /***********************************************************************
  754.  *
  755.  *  do_acsi_request and friends
  756.  *
  757.  ***********************************************************************/
  758. static void do_acsi_request( request_queue_t * q )
  759. {
  760. stdma_lock( acsi_interrupt, NULL );
  761. redo_acsi_request();
  762. }
  763. static void redo_acsi_request( void )
  764. { unsigned block, dev, target, lun, nsect;
  765. char  *buffer;
  766. unsigned long pbuffer;
  767. struct buffer_head *bh;
  768. if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE) {
  769. if (!DEVICE_INTR) {
  770. ENABLE_IRQ();
  771. stdma_release();
  772. }
  773. return;
  774. }
  775. if (DEVICE_INTR)
  776. return;
  777.   repeat:
  778. CLEAR_TIMER();
  779. /* Another check here: An interrupt or timer event could have
  780.  * happened since the last check!
  781.  */
  782. if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE) {
  783. if (!DEVICE_INTR) {
  784. ENABLE_IRQ();
  785. stdma_release();
  786. }
  787. return;
  788. }
  789. if (DEVICE_INTR)
  790. return;
  791. if (QUEUE_EMPTY) {
  792. CLEAR_INTR;
  793. ENABLE_IRQ();
  794. stdma_release();
  795. return;
  796. }
  797. if (MAJOR(CURRENT->rq_dev) != MAJOR_NR)
  798. panic(DEVICE_NAME ": request list destroyed");
  799. if (CURRENT->bh) {
  800. if (!CURRENT->bh && !buffer_locked(CURRENT->bh))
  801. panic(DEVICE_NAME ": block not locked");
  802. }
  803. dev = MINOR(CURRENT->rq_dev);
  804. block = CURRENT->sector;
  805. if (DEVICE_NR(dev) >= NDevices ||
  806. block+CURRENT->nr_sectors >= acsi_part[dev].nr_sects) {
  807. #ifdef DEBUG
  808. printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.n",
  809.        DEVICE_NR(dev)+'a',
  810.        block, block + CURRENT->nr_sectors - 1,
  811.        acsi_part[dev].nr_sects);
  812. #endif
  813. end_request(0);
  814. goto repeat;
  815. }
  816. if (acsi_info[DEVICE_NR(dev)].changed) {
  817. printk( KERN_NOTICE "ad%c: request denied because cartridge has "
  818. "been changed.n", DEVICE_NR(dev)+'a' );
  819. end_request(0);
  820. goto repeat;
  821. }
  822. block += acsi_part[dev].start_sect;
  823. target = acsi_info[DEVICE_NR(dev)].target;
  824. lun    = acsi_info[DEVICE_NR(dev)].lun;
  825. /* Find out how many sectors should be transferred from/to
  826.  * consecutive buffers and thus can be done with a single command.
  827.  */
  828. buffer      = CURRENT->buffer;
  829. pbuffer     = virt_to_phys(buffer);
  830. nsect       = CURRENT->current_nr_sectors;
  831. CurrentNReq = 1;
  832. if ((bh = CURRENT->bh) && bh != CURRENT->bhtail) {
  833. if (!STRAM_ADDR(pbuffer)) {
  834. /* If transfer is done via the ACSI buffer anyway, we can
  835.  * assemble as much bh's as fit in the buffer.
  836.  */
  837. while( (bh = bh->b_reqnext) ) {
  838. if (nsect + (bh->b_size>>9) > ACSI_BUFFER_SECTORS) break;
  839. nsect += bh->b_size >> 9;
  840. ++CurrentNReq;
  841. if (bh == CURRENT->bhtail) break;
  842. }
  843. buffer = acsi_buffer;
  844. pbuffer = phys_acsi_buffer;
  845. }
  846. else {
  847. unsigned long pendadr, pnewadr;
  848. pendadr = pbuffer + nsect*512;
  849. while( (bh = bh->b_reqnext) ) {
  850. pnewadr = virt_to_phys(bh->b_data);
  851. if (!STRAM_ADDR(pnewadr) || pendadr != pnewadr) break;
  852. nsect += bh->b_size >> 9;
  853. pendadr = pnewadr + bh->b_size;
  854. ++CurrentNReq;
  855. if (bh == CURRENT->bhtail) break;
  856. }
  857. }
  858. }
  859. else {
  860. if (!STRAM_ADDR(pbuffer)) {
  861. buffer = acsi_buffer;
  862. pbuffer = phys_acsi_buffer;
  863. if (nsect > ACSI_BUFFER_SECTORS)
  864. nsect = ACSI_BUFFER_SECTORS;
  865. }
  866. }
  867. CurrentBuffer = buffer;
  868. CurrentNSect  = nsect;
  869. if (CURRENT->cmd == WRITE) {
  870. CMDSET_TARG_LUN( write_cmd, target, lun );
  871. CMDSET_BLOCK( write_cmd, block );
  872. CMDSET_LEN( write_cmd, nsect );
  873. if (buffer == acsi_buffer)
  874. copy_to_acsibuffer();
  875. dma_cache_maintenance( pbuffer, nsect*512, 1 );
  876. SET_INTR(write_intr);
  877. if (!acsicmd_dma( write_cmd, buffer, nsect, 1, 1)) {
  878. CLEAR_INTR;
  879. printk( KERN_ERR "ACSI (write): Timeout in command blockn" );
  880. bad_rw_intr();
  881. goto repeat;
  882. }
  883. SET_TIMER();
  884. return;
  885. }
  886. if (CURRENT->cmd == READ) {
  887. CMDSET_TARG_LUN( read_cmd, target, lun );
  888. CMDSET_BLOCK( read_cmd, block );
  889. CMDSET_LEN( read_cmd, nsect );
  890. SET_INTR(read_intr);
  891. if (!acsicmd_dma( read_cmd, buffer, nsect, 0, 1)) {
  892. CLEAR_INTR;
  893. printk( KERN_ERR "ACSI (read): Timeout in command blockn" );
  894. bad_rw_intr();
  895. goto repeat;
  896. }
  897. SET_TIMER();
  898. return;
  899. }
  900. panic("unknown ACSI command");
  901. }
  902. /***********************************************************************
  903.  *
  904.  *  Misc functions: ioctl, open, release, check_change, ...
  905.  *
  906.  ***********************************************************************/
  907. static int acsi_ioctl( struct inode *inode, struct file *file,
  908.    unsigned int cmd, unsigned long arg )
  909. { int dev;
  910. if (!inode)
  911. return -EINVAL;
  912. dev = DEVICE_NR(MINOR(inode->i_rdev));
  913. if (dev >= NDevices)
  914. return -EINVAL;
  915. switch (cmd) {
  916.   case HDIO_GETGEO:
  917. /* HDIO_GETGEO is supported more for getting the partition's
  918.  * start sector... */
  919.   { struct hd_geometry *geo = (struct hd_geometry *)arg;
  920.     /* just fake some geometry here, it's nonsense anyway; to make it
  921.  * easy, use Adaptec's usual 64/32 mapping */
  922.     put_user( 64, &geo->heads );
  923.     put_user( 32, &geo->sectors );
  924.     put_user( acsi_info[dev].size >> 11, &geo->cylinders );
  925. put_user( acsi_part[MINOR(inode->i_rdev)].start_sect, &geo->start );
  926. return 0;
  927.   }
  928.   case SCSI_IOCTL_GET_IDLUN:
  929. /* SCSI compatible GET_IDLUN call to get target's ID and LUN number */
  930. put_user( acsi_info[dev].target | (acsi_info[dev].lun << 8),
  931.   &((Scsi_Idlun *) arg)->dev_id );
  932. put_user( 0, &((Scsi_Idlun *) arg)->host_unique_id );
  933. return 0;
  934.   case BLKGETSIZE:
  935.   case BLKGETSIZE64:
  936.   case BLKROSET:
  937.   case BLKROGET:
  938.   case BLKFLSBUF:
  939.   case BLKPG:
  940. return blk_ioctl(inode->i_rdev, cmd, arg);
  941.   case BLKRRPART: /* Re-read partition tables */
  942.         if (!capable(CAP_SYS_ADMIN)) 
  943. return -EACCES;
  944. return revalidate_acsidisk(inode->i_rdev, 1);
  945.   default:
  946. return -EINVAL;
  947. }
  948. }
  949. /*
  950.  * Open a device, check for read-only and lock the medium if it is
  951.  * removable.
  952.  *
  953.  * Changes by Martin Rogge, 9th Aug 1995:
  954.  * Check whether check_disk_change (and therefore revalidate_acsidisk)
  955.  * was successful. They fail when there is no medium in the drive.
  956.  *
  957.  * The problem of media being changed during an operation can be 
  958.  * ignored because of the prevent_removal code.
  959.  *
  960.  * Added check for the validity of the device number.
  961.  *
  962.  */
  963. static int acsi_open( struct inode * inode, struct file * filp )
  964. {
  965. int  device;
  966. struct acsi_info_struct *aip;
  967. device = DEVICE_NR(MINOR(inode->i_rdev));
  968. if (device >= NDevices)
  969. return -ENXIO;
  970. aip = &acsi_info[device];
  971. while (busy[device])
  972. sleep_on(&busy_wait);
  973. if (access_count[device] == 0 && aip->removable) {
  974. #if 0
  975. aip->changed = 1; /* safety first */
  976. #endif
  977. check_disk_change( inode->i_rdev );
  978. if (aip->changed) /* revalidate was not successful (no medium) */
  979. return -ENXIO;
  980. acsi_prevent_removal(device, 1);
  981. }
  982. access_count[device]++;
  983. if (filp && filp->f_mode) {
  984. check_disk_change( inode->i_rdev );
  985. if (filp->f_mode & 2) {
  986. if (aip->read_only) {
  987. acsi_release( inode, filp );
  988. return -EROFS;
  989. }
  990. }
  991. }
  992. return 0;
  993. }
  994. /*
  995.  * Releasing a block device means we sync() it, so that it can safely
  996.  * be forgotten about...
  997.  */
  998. static int acsi_release( struct inode * inode, struct file * file )
  999. {
  1000. int device = DEVICE_NR(MINOR(inode->i_rdev));
  1001. if (--access_count[device] == 0 && acsi_info[device].removable)
  1002. acsi_prevent_removal(device, 0);
  1003. return( 0 );
  1004. }
  1005. /*
  1006.  * Prevent or allow a media change for removable devices.
  1007.  */
  1008. static void acsi_prevent_removal(int device, int flag)
  1009. {
  1010. stdma_lock( NULL, NULL );
  1011. CMDSET_TARG_LUN(pa_med_rem_cmd, acsi_info[device].target,
  1012. acsi_info[device].lun);
  1013. CMDSET_LEN( pa_med_rem_cmd, flag );
  1014. if (acsicmd_nodma(pa_med_rem_cmd, 0) && acsi_wait_for_IRQ(3*HZ))
  1015. acsi_getstatus();
  1016. /* Do not report errors -- some devices may not know this command. */
  1017. ENABLE_IRQ();
  1018. stdma_release();
  1019. }
  1020. static int acsi_media_change (dev_t dev)
  1021. {
  1022. int device = DEVICE_NR(MINOR(dev));
  1023. struct acsi_info_struct *aip;
  1024. aip = &acsi_info[device];
  1025. if (!aip->removable) 
  1026. return 0;
  1027. if (aip->changed)
  1028. /* We can be sure that the medium has been changed -- REQUEST
  1029.  * SENSE has reported this earlier.
  1030.  */
  1031. return 1;
  1032. /* If the flag isn't set, make a test by reading block 0.
  1033.  * If errors happen, it seems to be better to say "changed"...
  1034.  */
  1035. stdma_lock( NULL, NULL );
  1036. CMDSET_TARG_LUN(read_cmd, aip->target, aip->lun);
  1037. CMDSET_BLOCK( read_cmd, 0 );
  1038. CMDSET_LEN( read_cmd, 1 );
  1039. if (acsicmd_dma(read_cmd, acsi_buffer, 1, 0, 0) &&
  1040.     acsi_wait_for_IRQ(3*HZ)) {
  1041. if (acsi_getstatus()) {
  1042. if (acsi_reqsense(acsi_buffer, aip->target, aip->lun)) {
  1043. if (CARTRCH_STAT(device, acsi_buffer))
  1044. aip->changed = 1;
  1045. }
  1046. else {
  1047. printk( KERN_ERR "ad%c: REQUEST SENSE failed in test for "
  1048.        "medium change; assuming a changen", device + 'a' );
  1049. aip->changed = 1;
  1050. }
  1051. }
  1052. }
  1053. else {
  1054. printk( KERN_ERR "ad%c: Test for medium changed timed out; "
  1055. "assuming a changen", device + 'a');
  1056. aip->changed = 1;
  1057. }
  1058. ENABLE_IRQ();
  1059. stdma_release();
  1060. /* Now, after reading a block, the changed status is surely valid. */
  1061. return aip->changed;
  1062. }
  1063. static int acsi_change_blk_size( int target, int lun)
  1064. { int i;
  1065. for (i=0; i<12; i++)
  1066. acsi_buffer[i] = 0;
  1067. acsi_buffer[3] = 8;
  1068. acsi_buffer[10] = 2;
  1069. CMDSET_TARG_LUN( modeselect_cmd, target, lun);
  1070. if (!acsicmd_dma( modeselect_cmd, acsi_buffer, 1,1,0) ||
  1071. !acsi_wait_for_IRQ( 3*HZ ) ||
  1072. acsi_getstatus() != 0 ) {
  1073. return(0);
  1074. }
  1075. return(1);
  1076. }
  1077. static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd )
  1078. {
  1079. int page;
  1080. CMDSET_TARG_LUN( modesense_cmd, target, lun );
  1081. for (page=0; page<4; page++) {
  1082. modesense_cmd[2] = page;
  1083. if (!acsicmd_dma( modesense_cmd, acsi_buffer, 1, 0, 0 ) ||
  1084.     !acsi_wait_for_IRQ( 3*HZ ) ||
  1085.     acsi_getstatus())
  1086. continue;
  1087. /* read twice to jump over the second 16-byte border! */
  1088. udelay(300);
  1089. if (acsi_wait_for_noIRQ( 20 ) &&
  1090.     acsicmd_nodma( modesense_cmd, 0 ) &&
  1091.     acsi_wait_for_IRQ( 3*HZ ) &&
  1092.     acsi_getstatus() == 0)
  1093. break;
  1094. }
  1095. if (page == 4) {
  1096. return(0);
  1097. }
  1098. dma_cache_maintenance( phys_acsi_buffer, sizeof(SENSE_DATA), 0 );
  1099. *sd = *(SENSE_DATA *)acsi_buffer;
  1100. /* Validity check, depending on type of data */
  1101. switch( SENSE_TYPE(*sd) ) {
  1102.   case SENSE_TYPE_ATARI:
  1103. if (CAPACITY(*sd) == 0)
  1104. goto invalid_sense;
  1105. break;
  1106.   case SENSE_TYPE_SCSI:
  1107. if (sd->scsi.descriptor_size != 8)
  1108. goto invalid_sense;
  1109. break;
  1110.   case SENSE_TYPE_UNKNOWN:
  1111. printk( KERN_ERR "ACSI target %d, lun %d: Cannot interpret "
  1112. "sense datan", target, lun ); 
  1113.   invalid_sense:
  1114. #ifdef DEBUG
  1115. { int i;
  1116. printk( "Mode sense data for ACSI target %d, lun %d seem not valid:",
  1117. target, lun );
  1118. for( i = 0; i < sizeof(SENSE_DATA); ++i )
  1119. printk( "%02x ", (unsigned char)acsi_buffer[i] );
  1120. printk( "n" );
  1121. }
  1122. #endif
  1123. return( 0 );
  1124. }
  1125. return( 1 );
  1126. }
  1127. /*******************************************************************
  1128.  *
  1129.  *  Initialization
  1130.  *
  1131.  ********************************************************************/
  1132. extern struct block_device_operations acsi_fops;
  1133. static struct gendisk acsi_gendisk = {
  1134. major: MAJOR_NR,
  1135. major_name: "ad",
  1136. minor_shift: 4,
  1137. max_p: 1 << 4,
  1138. part: acsi_part,
  1139. sizes: acsi_sizes,
  1140. real_devices: (void *)acsi_info,
  1141. fops: &acsi_fops,
  1142. };
  1143. #define MAX_SCSI_DEVICE_CODE 10
  1144. static const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] =
  1145. {
  1146.  "Direct-Access    ",
  1147.  "Sequential-Access",
  1148.  "Printer          ",
  1149.  "Processor        ",
  1150.  "WORM             ",
  1151.  "CD-ROM           ",
  1152.  "Scanner          ",
  1153.  "Optical Device   ",
  1154.  "Medium Changer   ",
  1155.  "Communications   "
  1156. };
  1157. static void print_inquiry(unsigned char *data)
  1158. {
  1159. int i;
  1160. printk(KERN_INFO "  Vendor: ");
  1161. for (i = 8; i < 16; i++)
  1162. {
  1163.         if (data[i] >= 0x20 && i < data[4] + 5)
  1164. printk("%c", data[i]);
  1165. else
  1166. printk(" ");
  1167. }
  1168. printk("  Model: ");
  1169. for (i = 16; i < 32; i++)
  1170. {
  1171.         if (data[i] >= 0x20 && i < data[4] + 5)
  1172. printk("%c", data[i]);
  1173. else
  1174. printk(" ");
  1175. }
  1176. printk("  Rev: ");
  1177. for (i = 32; i < 36; i++)
  1178. {
  1179.         if (data[i] >= 0x20 && i < data[4] + 5)
  1180. printk("%c", data[i]);
  1181. else
  1182. printk(" ");
  1183. }
  1184. printk("n");
  1185. i = data[0] & 0x1f;
  1186. printk(KERN_INFO "  Type:   %s ", (i < MAX_SCSI_DEVICE_CODE
  1187.    ? scsi_device_types[i]
  1188.    : "Unknown          "));
  1189. printk("                 ANSI SCSI revision: %02x", data[2] & 0x07);
  1190. if ((data[2] & 0x07) == 1 && (data[3] & 0x0f) == 1)
  1191.   printk(" CCSn");
  1192. else
  1193.   printk("n");
  1194. }
  1195. /* 
  1196.  * Changes by Martin Rogge, 9th Aug 1995: 
  1197.  * acsi_devinit has been taken out of acsi_geninit, because it needs 
  1198.  * to be called from revalidate_acsidisk. The result of request sense 
  1199.  * is now checked for DRIVE NOT READY.
  1200.  *
  1201.  * The structure *aip is only valid when acsi_devinit returns 
  1202.  * DEV_SUPPORTED. 
  1203.  *
  1204.  */
  1205. #define DEV_NONE 0
  1206. #define DEV_UNKNOWN 1
  1207. #define DEV_SUPPORTED 2
  1208. #define DEV_SLM 3
  1209. static int acsi_devinit(struct acsi_info_struct *aip)
  1210. {
  1211. int status, got_inquiry;
  1212. SENSE_DATA sense;
  1213. unsigned char reqsense, extsense;
  1214. /*****************************************************************/
  1215. /* Do a TEST UNIT READY command to test the presence of a device */
  1216. /*****************************************************************/
  1217. CMDSET_TARG_LUN(tur_cmd, aip->target, aip->lun);
  1218. if (!acsicmd_nodma(tur_cmd, 0)) {
  1219. /* timed out -> no device here */
  1220. #ifdef DEBUG_DETECT
  1221. printk("target %d lun %d: timeoutn", aip->target, aip->lun);
  1222. #endif
  1223. return DEV_NONE;
  1224. }
  1225. /*************************/
  1226. /* Read the ACSI status. */
  1227. /*************************/
  1228. status = acsi_getstatus();
  1229. if (status) {
  1230. if (status == 0x12) {
  1231. /* The SLM printer should be the only device that
  1232.  * responds with the error code in the status byte. In
  1233.  * correct status bytes, bit 4 is never set.
  1234.  */
  1235. printk( KERN_INFO "Detected SLM printer at id %d lun %dn",
  1236.        aip->target, aip->lun);
  1237. return DEV_SLM;
  1238. }
  1239. /* ignore CHECK CONDITION, since some devices send a
  1240.    UNIT ATTENTION */
  1241. if ((status & 0x1e) != 0x2) {
  1242. #ifdef DEBUG_DETECT
  1243. printk("target %d lun %d: status %dn",
  1244.        aip->target, aip->lun, status);
  1245. #endif
  1246. return DEV_UNKNOWN;
  1247. }
  1248. }
  1249. /*******************************/
  1250. /* Do a REQUEST SENSE command. */
  1251. /*******************************/
  1252. if (!acsi_reqsense(acsi_buffer, aip->target, aip->lun)) {
  1253. printk( KERN_WARNING "acsi_reqsense failedn");
  1254. acsi_buffer[0] = 0;
  1255. acsi_buffer[2] = UNIT_ATTENTION;
  1256. }
  1257. reqsense = acsi_buffer[0];
  1258. extsense = acsi_buffer[2] & 0xf;
  1259. if (status) {
  1260. if ((reqsense & 0x70) == 0x70) { /* extended sense */
  1261. if (extsense != UNIT_ATTENTION &&
  1262.     extsense != NOT_READY) {
  1263. #ifdef DEBUG_DETECT
  1264. printk("target %d lun %d: extended sense %dn",
  1265.        aip->target, aip->lun, extsense);
  1266. #endif
  1267. return DEV_UNKNOWN;
  1268. }
  1269. }
  1270. else {
  1271. if (reqsense & 0x7f) {
  1272. #ifdef DEBUG_DETECT
  1273. printk("target %d lun %d: sense %dn",
  1274.        aip->target, aip->lun, reqsense);
  1275. #endif
  1276. return DEV_UNKNOWN;
  1277. }
  1278. }
  1279. }
  1280. else 
  1281. if (reqsense == 0x4) { /* SH204 Bug workaround */
  1282. #ifdef DEBUG_DETECT
  1283. printk("target %d lun %d status=0 sense=4n",
  1284.        aip->target, aip->lun);
  1285. #endif
  1286. return DEV_UNKNOWN;
  1287. }
  1288. /***********************************************************/
  1289. /* Do an INQUIRY command to get more infos on this device. */
  1290. /***********************************************************/
  1291. /* Assume default values */
  1292. aip->removable = 1;
  1293. aip->read_only = 0;
  1294. aip->old_atari_disk = 0;
  1295. aip->changed = (extsense == NOT_READY); /* medium inserted? */
  1296. aip->size = DEFAULT_SIZE;
  1297. got_inquiry = 0;
  1298. /* Fake inquiry result for old atari disks */
  1299. memcpy(acsi_buffer, "00000100    Adaptec 40xx"
  1300.        "                    ", 40);
  1301. CMDSET_TARG_LUN(inquiry_cmd, aip->target, aip->lun);
  1302. if (acsicmd_dma(inquiry_cmd, acsi_buffer, 1, 0, 0) &&
  1303.     acsi_getstatus() == 0) {
  1304. acsicmd_nodma(inquiry_cmd, 0);
  1305. acsi_getstatus();
  1306. dma_cache_maintenance( phys_acsi_buffer, 256, 0 );
  1307. got_inquiry = 1;
  1308. aip->removable = !!(acsi_buffer[1] & 0x80);
  1309. }
  1310. if (aip->type == NONE) /* only at boot time */
  1311. print_inquiry(acsi_buffer);
  1312. switch(acsi_buffer[0]) {
  1313.   case TYPE_DISK:
  1314. aip->type = HARDDISK;
  1315. break;
  1316.   case TYPE_ROM:
  1317. aip->type = CDROM;
  1318. aip->read_only = 1;
  1319. break;
  1320.   default:
  1321. return DEV_UNKNOWN;
  1322. }
  1323. /****************************/
  1324. /* Do a MODE SENSE command. */
  1325. /****************************/
  1326. if (!acsi_mode_sense(aip->target, aip->lun, &sense)) {
  1327. printk( KERN_WARNING "No mode sense data.n" );
  1328. return DEV_UNKNOWN;
  1329. }
  1330. if ((SECTOR_SIZE(sense) != 512) &&
  1331.     ((aip->type != CDROM) ||
  1332.      !acsi_change_blk_size(aip->target, aip->lun) ||
  1333.      !acsi_mode_sense(aip->target, aip->lun, &sense) ||
  1334.      (SECTOR_SIZE(sense) != 512))) {
  1335. printk( KERN_WARNING "Sector size != 512 not supported.n" );
  1336. return DEV_UNKNOWN;
  1337. }
  1338. /* There are disks out there that claim to have 0 sectors... */
  1339. if (CAPACITY(sense))
  1340. aip->size = CAPACITY(sense); /* else keep DEFAULT_SIZE */
  1341. if (!got_inquiry && SENSE_TYPE(sense) == SENSE_TYPE_ATARI) {
  1342. /* If INQUIRY failed and the sense data suggest an old
  1343.  * Atari disk (SH20x, Megafile), the disk is not removable
  1344.  */
  1345. aip->removable = 0;
  1346. aip->old_atari_disk = 1;
  1347. }
  1348. /******************/
  1349. /* We've done it. */
  1350. /******************/
  1351. return DEV_SUPPORTED;
  1352. }
  1353. EXPORT_SYMBOL(acsi_delay_start);
  1354. EXPORT_SYMBOL(acsi_delay_end);
  1355. EXPORT_SYMBOL(acsi_wait_for_IRQ);
  1356. EXPORT_SYMBOL(acsi_wait_for_noIRQ);
  1357. EXPORT_SYMBOL(acsicmd_nodma);
  1358. EXPORT_SYMBOL(acsi_getstatus);
  1359. EXPORT_SYMBOL(acsi_buffer);
  1360. EXPORT_SYMBOL(phys_acsi_buffer);
  1361. #ifdef CONFIG_ATARI_SLM_MODULE
  1362. void acsi_attach_SLMs( int (*attach_func)( int, int ) );
  1363. EXPORT_SYMBOL(acsi_extstatus);
  1364. EXPORT_SYMBOL(acsi_end_extstatus);
  1365. EXPORT_SYMBOL(acsi_extcmd);
  1366. EXPORT_SYMBOL(acsi_attach_SLMs);
  1367. /* to remember IDs of SLM devices, SLM module is loaded later
  1368.  * (index is target#, contents is lun#, -1 means "no SLM") */
  1369. int SLM_devices[8];
  1370. #endif
  1371. static struct block_device_operations acsi_fops = {
  1372. owner: THIS_MODULE,
  1373. open: acsi_open,
  1374. release: acsi_release,
  1375. ioctl: acsi_ioctl,
  1376. check_media_change: acsi_media_change,
  1377. revalidate: acsi_revalidate,
  1378. };
  1379. static void acsi_geninit(void)
  1380. {
  1381. int i, target, lun;
  1382. struct acsi_info_struct *aip;
  1383. #ifdef CONFIG_ATARI_SLM
  1384. int n_slm = 0;
  1385. #endif
  1386. printk( KERN_INFO "Probing ACSI devices:n" );
  1387. NDevices = 0;
  1388. #ifdef CONFIG_ATARI_SLM_MODULE
  1389. for( i = 0; i < 8; ++i )
  1390. SLM_devices[i] = -1;
  1391. #endif
  1392. stdma_lock(NULL, NULL);
  1393. for (target = 0; target < 8 && NDevices < MAX_DEV; ++target) {
  1394. lun = 0;
  1395. do {
  1396. aip = &acsi_info[NDevices];
  1397. aip->type = NONE;
  1398. aip->target = target;
  1399. aip->lun = lun;
  1400. i = acsi_devinit(aip);
  1401. switch (i) {
  1402.   case DEV_SUPPORTED:
  1403. printk( KERN_INFO "Detected ");
  1404. switch (aip->type) {
  1405.   case HARDDISK:
  1406. printk("disk");
  1407. break;
  1408.   case CDROM:
  1409. printk("cdrom");
  1410. break;
  1411.   default:
  1412. }
  1413. printk(" ad%c at id %d lun %d ",
  1414.        'a' + NDevices, target, lun);
  1415. if (aip->removable) 
  1416. printk("(removable) ");
  1417. if (aip->read_only) 
  1418. printk("(read-only) ");
  1419. if (aip->size == DEFAULT_SIZE)
  1420. printk(" unkown size, using default ");
  1421. printk("%ld MByten",
  1422.        (aip->size*512+1024*1024/2)/(1024*1024));
  1423. NDevices++;
  1424. break;
  1425.   case DEV_SLM:
  1426. #ifdef CONFIG_ATARI_SLM
  1427. n_slm += attach_slm( target, lun );
  1428. break;
  1429. #endif
  1430. #ifdef CONFIG_ATARI_SLM_MODULE
  1431. SLM_devices[target] = lun;
  1432. break;
  1433. #endif
  1434. /* neither of the above: fall through to unknown device */
  1435.   case DEV_UNKNOWN:
  1436. printk( KERN_INFO "Detected unsupported device at "
  1437. "id %d lun %dn", target, lun);
  1438. break;
  1439. }
  1440. }
  1441. #ifdef CONFIG_ACSI_MULTI_LUN
  1442. while (i != DEV_NONE && ++lun < MAX_LUN);
  1443. #else
  1444. while (0);
  1445. #endif
  1446. }
  1447. /* reenable interrupt */
  1448. ENABLE_IRQ();
  1449. stdma_release();
  1450. #ifndef CONFIG_ATARI_SLM
  1451. printk( KERN_INFO "Found %d ACSI device(s) total.n", NDevices );
  1452. #else
  1453. printk( KERN_INFO "Found %d ACSI device(s) and %d SLM printer(s) total.n",
  1454. NDevices, n_slm );
  1455. #endif
  1456.  
  1457. for( i = 0; i < (MAX_DEV << 4); i++ )
  1458. acsi_blocksizes[i] = 1024;
  1459. blksize_size[MAJOR_NR] = acsi_blocksizes;
  1460. for( i = 0; i < NDevices; ++i )
  1461. register_disk(&acsi_gendisk, MKDEV(MAJOR_NR,i<<4),
  1462. (acsi_info[i].type==HARDDISK)?1<<4:1,
  1463. &acsi_fops,
  1464. acsi_info[i].size);
  1465. acsi_gendisk.nr_real = NDevices;
  1466. }
  1467. #ifdef CONFIG_ATARI_SLM_MODULE
  1468. /* call attach_slm() for each device that is a printer; needed for init of SLM
  1469.  * driver as a module, since it's not yet present if acsi.c is inited and thus
  1470.  * the bus gets scanned. */
  1471. void acsi_attach_SLMs( int (*attach_func)( int, int ) )
  1472. {
  1473. int i, n = 0;
  1474. for( i = 0; i < 8; ++i )
  1475. if (SLM_devices[i] >= 0)
  1476. n += (*attach_func)( i, SLM_devices[i] );
  1477. printk( KERN_INFO "Found %d SLM printer(s) total.n", n );
  1478. }
  1479. #endif /* CONFIG_ATARI_SLM_MODULE */
  1480. int acsi_init( void )
  1481. {
  1482. int err = 0;
  1483. if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ACSI))
  1484. return 0;
  1485. if (devfs_register_blkdev( MAJOR_NR, "ad", &acsi_fops )) {
  1486. printk( KERN_ERR "Unable to get major %d for ACSIn", MAJOR_NR );
  1487. return -EBUSY;
  1488. }
  1489. if (!(acsi_buffer =
  1490.   (char *)atari_stram_alloc(ACSI_BUFFER_SIZE, "acsi"))) {
  1491. printk( KERN_ERR "Unable to get ACSI ST-Ram buffer.n" );
  1492. devfs_unregister_blkdev( MAJOR_NR, "ad" );
  1493. return -ENOMEM;
  1494. }
  1495. phys_acsi_buffer = virt_to_phys( acsi_buffer );
  1496. STramMask = ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000 : 0xff000000;
  1497. blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
  1498. read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read-ahead */
  1499. add_gendisk(&acsi_gendisk);
  1500. #ifdef CONFIG_ATARI_SLM
  1501. err = slm_init();
  1502. #endif
  1503. if (!err)
  1504. acsi_geninit();
  1505. return err;
  1506. }
  1507. #ifdef MODULE
  1508. MODULE_LICENSE("GPL");
  1509. int init_module(void)
  1510. {
  1511. int err;
  1512. if ((err = acsi_init()))
  1513. return( err );
  1514. printk( KERN_INFO "ACSI driver loaded as module.n");
  1515. return( 0 );
  1516. }
  1517. void cleanup_module(void)
  1518. {
  1519. del_timer( &acsi_timer );
  1520. blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
  1521. atari_stram_free( acsi_buffer );
  1522. if (devfs_unregister_blkdev( MAJOR_NR, "ad" ) != 0)
  1523. printk( KERN_ERR "acsi: cleanup_module failedn");
  1524. del_gendisk(&acsi_gendisk);
  1525. }
  1526. #endif
  1527. #define DEVICE_BUSY busy[device]
  1528. #define USAGE access_count[device]
  1529. #define GENDISK_STRUCT acsi_gendisk
  1530. /*
  1531.  * This routine is called to flush all partitions and partition tables
  1532.  * for a changed scsi disk, and then re-read the new partition table.
  1533.  * If we are revalidating a disk because of a media change, then we
  1534.  * enter with usage == 0.  If we are using an ioctl, we automatically have
  1535.  * usage == 1 (we need an open channel to use an ioctl :-), so this
  1536.  * is our limit.
  1537.  *
  1538.  * Changes by Martin Rogge, 9th Aug 1995: 
  1539.  * got cd-roms to work by calling acsi_devinit. There are only two problems:
  1540.  * First, if there is no medium inserted, the status will remain "changed".
  1541.  * That is no problem at all, but our design of three-valued logic (medium
  1542.  * changed, medium not changed, no medium inserted).
  1543.  * Secondly the check could fail completely and the drive could deliver
  1544.  * nonsensical data, which could mess up the acsi_info[] structure. In
  1545.  * that case we try to make the entry safe.
  1546.  *
  1547.  */
  1548. static int revalidate_acsidisk( int dev, int maxusage )
  1549. {
  1550. int device;
  1551. struct gendisk * gdev;
  1552. int max_p, start, i;
  1553. struct acsi_info_struct *aip;
  1554. device = DEVICE_NR(MINOR(dev));
  1555. aip = &acsi_info[device];
  1556. gdev = &GENDISK_STRUCT;
  1557. cli();
  1558. if (DEVICE_BUSY || USAGE > maxusage) {
  1559. sti();
  1560. return -EBUSY;
  1561. };
  1562. DEVICE_BUSY = 1;
  1563. sti();
  1564. max_p = gdev->max_p;
  1565. start = device << gdev->minor_shift;
  1566. for( i = max_p - 1; i >= 0 ; i-- ) {
  1567. if (gdev->part[start + i].nr_sects != 0) {
  1568. invalidate_device(MKDEV(MAJOR_NR, start + i), 1);
  1569. gdev->part[start + i].nr_sects = 0;
  1570. }
  1571. gdev->part[start+i].start_sect = 0;
  1572. };
  1573. stdma_lock( NULL, NULL );
  1574. if (acsi_devinit(aip) != DEV_SUPPORTED) {
  1575. printk( KERN_ERR "ACSI: revalidate failed for target %d lun %dn",
  1576.        aip->target, aip->lun);
  1577. aip->size = 0;
  1578. aip->read_only = 1;
  1579. aip->removable = 1;
  1580. aip->changed = 1; /* next acsi_open will try again... */
  1581. }
  1582. ENABLE_IRQ();
  1583. stdma_release();
  1584. grok_partitions(gdev, device, (aip->type==HARDDISK)?1<<4:1, aip->size);
  1585. DEVICE_BUSY = 0;
  1586. wake_up(&busy_wait);
  1587. return 0;
  1588. }
  1589. static int acsi_revalidate (dev_t dev)
  1590. {
  1591.   return revalidate_acsidisk (dev, 0);
  1592. }