swim3.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:28k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Driver for the SWIM3 (Super Woz Integrated Machine 3)
  3.  * floppy controller found on Power Macintoshes.
  4.  *
  5.  * Copyright (C) 1996 Paul Mackerras.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  */
  12. /*
  13.  * TODO:
  14.  * handle 2 drives
  15.  * handle GCR disks
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/stddef.h>
  19. #include <linux/kernel.h>
  20. #include <linux/sched.h>
  21. #include <linux/timer.h>
  22. #include <linux/delay.h>
  23. #include <linux/fd.h>
  24. #include <linux/ioctl.h>
  25. #include <asm/io.h>
  26. #include <asm/dbdma.h>
  27. #include <asm/prom.h>
  28. #include <asm/uaccess.h>
  29. #include <asm/mediabay.h>
  30. #include <asm/machdep.h>
  31. #include <asm/pmac_feature.h>
  32. #define MAJOR_NR FLOPPY_MAJOR
  33. #include <linux/blk.h>
  34. #include <linux/devfs_fs_kernel.h>
  35. static int floppy_blocksizes[2] = {512,512};
  36. static int floppy_sizes[2] = {1440,1440};
  37. #define MAX_FLOPPIES 2
  38. enum swim_state {
  39. idle,
  40. locating,
  41. seeking,
  42. settling,
  43. do_transfer,
  44. jogging,
  45. available,
  46. revalidating,
  47. ejecting
  48. };
  49. #define REG(x) unsigned char x; char x ## _pad[15];
  50. /*
  51.  * The names for these registers mostly represent speculation on my part.
  52.  * It will be interesting to see how close they are to the names Apple uses.
  53.  */
  54. struct swim3 {
  55. REG(data);
  56. REG(timer); /* counts down at 1MHz */
  57. REG(error);
  58. REG(mode);
  59. REG(select); /* controls CA0, CA1, CA2 and LSTRB signals */
  60. REG(setup);
  61. REG(control); /* writing bits clears them */
  62. REG(status); /* writing bits sets them in control */
  63. REG(intr);
  64. REG(nseek); /* # tracks to seek */
  65. REG(ctrack); /* current track number */
  66. REG(csect); /* current sector number */
  67. REG(gap3); /* size of gap 3 in track format */
  68. REG(sector); /* sector # to read or write */
  69. REG(nsect); /* # sectors to read or write */
  70. REG(intr_enable);
  71. };
  72. #define control_bic control
  73. #define control_bis status
  74. /* Bits in select register */
  75. #define CA_MASK 7
  76. #define LSTRB 8
  77. /* Bits in control register */
  78. #define DO_SEEK 0x80
  79. #define FORMAT 0x40
  80. #define SELECT 0x20
  81. #define WRITE_SECTORS 0x10
  82. #define DO_ACTION 0x08
  83. #define DRIVE2_ENABLE 0x04
  84. #define DRIVE_ENABLE 0x02
  85. #define INTR_ENABLE 0x01
  86. /* Bits in status register */
  87. #define FIFO_1BYTE 0x80
  88. #define FIFO_2BYTE 0x40
  89. #define ERROR 0x20
  90. #define DATA 0x08
  91. #define RDDATA 0x04
  92. #define INTR_PENDING 0x02
  93. #define MARK_BYTE 0x01
  94. /* Bits in intr and intr_enable registers */
  95. #define ERROR_INTR 0x20
  96. #define DATA_CHANGED 0x10
  97. #define TRANSFER_DONE 0x08
  98. #define SEEN_SECTOR 0x04
  99. #define SEEK_DONE 0x02
  100. #define TIMER_DONE 0x01
  101. /* Bits in error register */
  102. #define ERR_DATA_CRC 0x80
  103. #define ERR_ADDR_CRC 0x40
  104. #define ERR_OVERRUN 0x04
  105. #define ERR_UNDERRUN 0x01
  106. /* Bits in setup register */
  107. #define S_SW_RESET 0x80
  108. #define S_GCR_WRITE 0x40
  109. #define S_IBM_DRIVE 0x20
  110. #define S_TEST_MODE 0x10
  111. #define S_FCLK_DIV2 0x08
  112. #define S_GCR 0x04
  113. #define S_COPY_PROT 0x02
  114. #define S_INV_WDATA 0x01
  115. /* Select values for swim3_action */
  116. #define SEEK_POSITIVE 0
  117. #define SEEK_NEGATIVE 4
  118. #define STEP 1
  119. #define MOTOR_ON 2
  120. #define MOTOR_OFF 6
  121. #define INDEX 3
  122. #define EJECT 7
  123. #define SETMFM 9
  124. #define SETGCR 13
  125. /* Select values for swim3_select and swim3_readbit */
  126. #define STEP_DIR 0
  127. #define STEPPING 1
  128. #define MOTOR_ON 2
  129. #define RELAX 3 /* also eject in progress */
  130. #define READ_DATA_0 4
  131. #define TWOMEG_DRIVE 5
  132. #define SINGLE_SIDED 6
  133. #define DRIVE_PRESENT 7
  134. #define DISK_IN 8
  135. #define WRITE_PROT 9
  136. #define TRACK_ZERO 10
  137. #define TACHO 11
  138. #define READ_DATA_1 12
  139. #define MFM_MODE 13
  140. #define SEEK_COMPLETE 14
  141. #define ONEMEG_MEDIA 15
  142. /* Definitions of values used in writing and formatting */
  143. #define DATA_ESCAPE 0x99
  144. #define GCR_SYNC_EXC 0x3f
  145. #define GCR_SYNC_CONV 0x80
  146. #define GCR_FIRST_MARK 0xd5
  147. #define GCR_SECOND_MARK 0xaa
  148. #define GCR_ADDR_MARK "xd5xaax00"
  149. #define GCR_DATA_MARK "xd5xaax0b"
  150. #define GCR_SLIP_BYTE "x27xaa"
  151. #define GCR_SELF_SYNC "x3fxbfx1ex34x3cx3f"
  152. #define DATA_99 "x99x99"
  153. #define MFM_ADDR_MARK "x99xa1x99xa1x99xa1x99xfe"
  154. #define MFM_INDEX_MARK "x99xc2x99xc2x99xc2x99xfc"
  155. #define MFM_GAP_LEN 12
  156. struct floppy_state {
  157. enum swim_state state;
  158. volatile struct swim3 *swim3; /* hardware registers */
  159. struct dbdma_regs *dma; /* DMA controller registers */
  160. int swim3_intr; /* interrupt number for SWIM3 */
  161. int dma_intr; /* interrupt number for DMA channel */
  162. int cur_cyl; /* cylinder head is on, or -1 */
  163. int cur_sector; /* last sector we saw go past */
  164. int req_cyl; /* the cylinder for the current r/w request */
  165. int head; /* head number ditto */
  166. int req_sector; /* sector number ditto */
  167. int scount; /* # sectors we're transferring at present */
  168. int retries;
  169. int secpercyl; /* disk geometry information */
  170. int secpertrack;
  171. int total_secs;
  172. int write_prot; /* 1 if write-protected, 0 if not, -1 dunno */
  173. struct dbdma_cmd *dma_cmd;
  174. int ref_count;
  175. int expect_cyl;
  176. struct timer_list timeout;
  177. int timeout_pending;
  178. int ejected;
  179. wait_queue_head_t wait;
  180. int wanted;
  181. struct device_node* media_bay; /* NULL when not in bay */
  182. char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)];
  183. };
  184. static struct floppy_state floppy_states[MAX_FLOPPIES];
  185. static int floppy_count = 0;
  186. static unsigned short write_preamble[] = {
  187. 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, /* gap field */
  188. 0, 0, 0, 0, 0, 0, /* sync field */
  189. 0x99a1, 0x99a1, 0x99a1, 0x99fb, /* data address mark */
  190. 0x990f /* no escape for 512 bytes */
  191. };
  192. static unsigned short write_postamble[] = {
  193. 0x9904, /* insert CRC */
  194. 0x4e4e, 0x4e4e,
  195. 0x9908, /* stop writing */
  196. 0, 0, 0, 0, 0, 0
  197. };
  198. static void swim3_select(struct floppy_state *fs, int sel);
  199. static void swim3_action(struct floppy_state *fs, int action);
  200. static int swim3_readbit(struct floppy_state *fs, int bit);
  201. static void do_fd_request(request_queue_t * q);
  202. static void start_request(struct floppy_state *fs);
  203. static void set_timeout(struct floppy_state *fs, int nticks,
  204. void (*proc)(unsigned long));
  205. static void scan_track(struct floppy_state *fs);
  206. static void seek_track(struct floppy_state *fs, int n);
  207. static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count);
  208. static void setup_transfer(struct floppy_state *fs);
  209. static void act(struct floppy_state *fs);
  210. static void scan_timeout(unsigned long data);
  211. static void seek_timeout(unsigned long data);
  212. static void xfer_timeout(unsigned long data);
  213. static void swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  214. /*static void fd_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs);*/
  215. static int grab_drive(struct floppy_state *fs, enum swim_state state,
  216.       int interruptible);
  217. static void release_drive(struct floppy_state *fs);
  218. static int fd_eject(struct floppy_state *fs);
  219. static int floppy_ioctl(struct inode *inode, struct file *filp,
  220. unsigned int cmd, unsigned long param);
  221. static int floppy_open(struct inode *inode, struct file *filp);
  222. static int floppy_release(struct inode *inode, struct file *filp);
  223. static int floppy_check_change(kdev_t dev);
  224. static int floppy_revalidate(kdev_t dev);
  225. static int swim3_add_device(struct device_node *swims);
  226. int swim3_init(void);
  227. #ifndef CONFIG_PMAC_PBOOK
  228. #define check_media_bay(which, what) 1
  229. #endif
  230. static void swim3_select(struct floppy_state *fs, int sel)
  231. {
  232. volatile struct swim3 *sw = fs->swim3;
  233. out_8(&sw->select, RELAX);
  234. if (sel & 8)
  235. out_8(&sw->control_bis, SELECT);
  236. else
  237. out_8(&sw->control_bic, SELECT);
  238. out_8(&sw->select, sel & CA_MASK);
  239. }
  240. static void swim3_action(struct floppy_state *fs, int action)
  241. {
  242. volatile struct swim3 *sw = fs->swim3;
  243. swim3_select(fs, action);
  244. udelay(1);
  245. out_8(&sw->select, sw->select | LSTRB);
  246. udelay(2);
  247. out_8(&sw->select, sw->select & ~LSTRB);
  248. udelay(1);
  249. out_8(&sw->select, RELAX);
  250. }
  251. static int swim3_readbit(struct floppy_state *fs, int bit)
  252. {
  253. volatile struct swim3 *sw = fs->swim3;
  254. int stat;
  255. swim3_select(fs, bit);
  256. udelay(10);
  257. stat = in_8(&sw->status);
  258. out_8(&sw->select, RELAX);
  259. return (stat & DATA) == 0;
  260. }
  261. static void do_fd_request(request_queue_t * q)
  262. {
  263. int i;
  264. for(i=0;i<floppy_count;i++)
  265. {
  266. if (floppy_states[i].media_bay &&
  267. check_media_bay(floppy_states[i].media_bay, MB_FD))
  268. continue;
  269. start_request(&floppy_states[i]);
  270. }
  271. sti();
  272. }
  273. static void start_request(struct floppy_state *fs)
  274. {
  275. unsigned long x;
  276. if (fs->state == idle && fs->wanted) {
  277. fs->state = available;
  278. wake_up(&fs->wait);
  279. return;
  280. }
  281. while (!QUEUE_EMPTY && fs->state == idle) {
  282. if (MAJOR(CURRENT->rq_dev) != MAJOR_NR)
  283. panic(DEVICE_NAME ": request list destroyed");
  284. if (CURRENT->bh && !buffer_locked(CURRENT->bh))
  285. panic(DEVICE_NAME ": block not locked");
  286. #if 0
  287. printk("do_fd_req: dev=%x cmd=%d sec=%ld nr_sec=%ld buf=%pn",
  288.        kdev_t_to_nr(CURRENT->rq_dev), CURRENT->cmd,
  289.        CURRENT->sector, CURRENT->nr_sectors, CURRENT->buffer);
  290. printk("           rq_status=%d errors=%d current_nr_sectors=%ldn",
  291.        CURRENT->rq_status, CURRENT->errors, CURRENT->current_nr_sectors);
  292. #endif
  293. if (CURRENT->sector < 0 || CURRENT->sector >= fs->total_secs) {
  294. end_request(0);
  295. continue;
  296. }
  297. if (CURRENT->current_nr_sectors == 0) {
  298. end_request(1);
  299. continue;
  300. }
  301. if (fs->ejected) {
  302. end_request(0);
  303. continue;
  304. }
  305. if (CURRENT->cmd == WRITE) {
  306. if (fs->write_prot < 0)
  307. fs->write_prot = swim3_readbit(fs, WRITE_PROT);
  308. if (fs->write_prot) {
  309. end_request(0);
  310. continue;
  311. }
  312. }
  313. fs->req_cyl = CURRENT->sector / fs->secpercyl;
  314. x = CURRENT->sector % fs->secpercyl;
  315. fs->head = x / fs->secpertrack;
  316. fs->req_sector = x % fs->secpertrack + 1;
  317. fs->state = do_transfer;
  318. fs->retries = 0;
  319. act(fs);
  320. }
  321. }
  322. static void set_timeout(struct floppy_state *fs, int nticks,
  323. void (*proc)(unsigned long))
  324. {
  325. unsigned long flags;
  326. save_flags(flags); cli();
  327. if (fs->timeout_pending)
  328. del_timer(&fs->timeout);
  329. fs->timeout.expires = jiffies + nticks;
  330. fs->timeout.function = proc;
  331. fs->timeout.data = (unsigned long) fs;
  332. add_timer(&fs->timeout);
  333. fs->timeout_pending = 1;
  334. restore_flags(flags);
  335. }
  336. static inline void scan_track(struct floppy_state *fs)
  337. {
  338. volatile struct swim3 *sw = fs->swim3;
  339. int xx;
  340. swim3_select(fs, READ_DATA_0);
  341. xx = sw->intr; /* clear SEEN_SECTOR bit */
  342. out_8(&sw->control_bis, DO_ACTION);
  343. /* enable intr when track found */
  344. out_8(&sw->intr_enable, ERROR_INTR | SEEN_SECTOR);
  345. set_timeout(fs, HZ, scan_timeout); /* enable timeout */
  346. }
  347. static inline void seek_track(struct floppy_state *fs, int n)
  348. {
  349. volatile struct swim3 *sw = fs->swim3;
  350. if (n >= 0) {
  351. swim3_action(fs, SEEK_POSITIVE);
  352. sw->nseek = n;
  353. } else {
  354. swim3_action(fs, SEEK_NEGATIVE);
  355. sw->nseek = -n;
  356. }
  357. fs->expect_cyl = (fs->cur_cyl > 0)? fs->cur_cyl + n: -1;
  358. swim3_select(fs, STEP);
  359. out_8(&sw->control_bis, DO_SEEK);
  360. /* enable intr when seek finished */
  361. out_8(&sw->intr_enable, ERROR_INTR | SEEK_DONE);
  362. set_timeout(fs, HZ/2, seek_timeout); /* enable timeout */
  363. }
  364. static inline void init_dma(struct dbdma_cmd *cp, int cmd,
  365.     void *buf, int count)
  366. {
  367. st_le16(&cp->req_count, count);
  368. st_le16(&cp->command, cmd);
  369. st_le32(&cp->phy_addr, virt_to_bus(buf));
  370. cp->xfer_status = 0;
  371. }
  372. static inline void setup_transfer(struct floppy_state *fs)
  373. {
  374. int n;
  375. volatile struct swim3 *sw = fs->swim3;
  376. struct dbdma_cmd *cp = fs->dma_cmd;
  377. struct dbdma_regs *dr = fs->dma;
  378. if (CURRENT->current_nr_sectors <= 0) {
  379. printk(KERN_ERR "swim3: transfer 0 sectors?n");
  380. return;
  381. }
  382. if (CURRENT->cmd == WRITE)
  383. n = 1;
  384. else {
  385. n = fs->secpertrack - fs->req_sector + 1;
  386. if (n > CURRENT->current_nr_sectors)
  387. n = CURRENT->current_nr_sectors;
  388. }
  389. fs->scount = n;
  390. swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0);
  391. out_8(&sw->sector, fs->req_sector);
  392. out_8(&sw->nsect, n);
  393. out_8(&sw->gap3, 0);
  394. st_le32(&dr->cmdptr, virt_to_bus(cp));
  395. if (CURRENT->cmd == WRITE) {
  396. /* Set up 3 dma commands: write preamble, data, postamble */
  397. init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble));
  398. ++cp;
  399. init_dma(cp, OUTPUT_MORE, CURRENT->buffer, 512);
  400. ++cp;
  401. init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble));
  402. } else {
  403. init_dma(cp, INPUT_LAST, CURRENT->buffer, n * 512);
  404. }
  405. ++cp;
  406. out_le16(&cp->command, DBDMA_STOP);
  407. out_le32(&dr->control, (RUN << 16) | RUN);
  408. out_8(&sw->control_bis,
  409.       (CURRENT->cmd == WRITE? WRITE_SECTORS: 0) | DO_ACTION);
  410. /* enable intr when transfer complete */
  411. out_8(&sw->intr_enable, ERROR_INTR | TRANSFER_DONE);
  412. set_timeout(fs, 2*HZ, xfer_timeout); /* enable timeout */
  413. }
  414. static void act(struct floppy_state *fs)
  415. {
  416. volatile struct swim3 *sw = fs->swim3;
  417. for (;;) {
  418. switch (fs->state) {
  419. case idle:
  420. return; /* XXX shouldn't get here */
  421. case locating:
  422. if (swim3_readbit(fs, TRACK_ZERO)) {
  423. fs->cur_cyl = 0;
  424. if (fs->req_cyl == 0)
  425. fs->state = do_transfer;
  426. else
  427. fs->state = seeking;
  428. break;
  429. }
  430. scan_track(fs);
  431. return;
  432. case seeking:
  433. if (fs->cur_cyl < 0) {
  434. fs->expect_cyl = -1;
  435. fs->state = locating;
  436. break;
  437. }
  438. if (fs->req_cyl == fs->cur_cyl) {
  439. printk("whoops, seeking 0n");
  440. fs->state = do_transfer;
  441. break;
  442. }
  443. seek_track(fs, fs->req_cyl - fs->cur_cyl);
  444. return;
  445. case settling:
  446. /* wait for SEEK_COMPLETE to become true */
  447. swim3_select(fs, SEEK_COMPLETE);
  448. udelay(10);
  449. out_8(&sw->intr_enable, ERROR_INTR | DATA_CHANGED);
  450. in_8(&sw->intr); /* clear DATA_CHANGED */
  451. if (in_8(&sw->status) & DATA) {
  452. /* seek_complete is not yet true */
  453. set_timeout(fs, HZ/2, seek_timeout);
  454. return;
  455. }
  456. out_8(&sw->intr_enable, 0);
  457. in_8(&sw->intr);
  458. fs->state = locating;
  459. break;
  460. case do_transfer:
  461. if (fs->cur_cyl != fs->req_cyl) {
  462. if (fs->retries > 5) {
  463. end_request(0);
  464. fs->state = idle;
  465. return;
  466. }
  467. fs->state = seeking;
  468. break;
  469. }
  470. setup_transfer(fs);
  471. return;
  472. case jogging:
  473. seek_track(fs, -5);
  474. return;
  475. default:
  476. printk(KERN_ERR"swim3: unknown state %dn", fs->state);
  477. return;
  478. }
  479. }
  480. }
  481. static void scan_timeout(unsigned long data)
  482. {
  483. struct floppy_state *fs = (struct floppy_state *) data;
  484. volatile struct swim3 *sw = fs->swim3;
  485. fs->timeout_pending = 0;
  486. out_8(&sw->control_bic, DO_ACTION);
  487. out_8(&sw->select, RELAX);
  488. out_8(&sw->intr_enable, 0);
  489. fs->cur_cyl = -1;
  490. if (fs->retries > 5) {
  491. end_request(0);
  492. fs->state = idle;
  493. start_request(fs);
  494. } else {
  495. fs->state = jogging;
  496. act(fs);
  497. }
  498. }
  499. static void seek_timeout(unsigned long data)
  500. {
  501. struct floppy_state *fs = (struct floppy_state *) data;
  502. volatile struct swim3 *sw = fs->swim3;
  503. fs->timeout_pending = 0;
  504. if (fs->state == settling) {
  505. printk(KERN_ERR "swim3: MSI sel=%x ctrl=%x stat=%x intr=%x ie=%xn",
  506.        sw->select, sw->control, sw->status, sw->intr, sw->intr_enable);
  507. }
  508. out_8(&sw->control_bic, DO_SEEK);
  509. out_8(&sw->select, RELAX);
  510. out_8(&sw->intr_enable, 0);
  511. if (fs->state == settling && swim3_readbit(fs, SEEK_COMPLETE)) {
  512. /* printk(KERN_DEBUG "swim3: missed settling interruptn"); */
  513. fs->state = locating;
  514. act(fs);
  515. return;
  516. }
  517. printk(KERN_ERR "swim3: seek timeoutn");
  518. end_request(0);
  519. fs->state = idle;
  520. start_request(fs);
  521. }
  522. static void xfer_timeout(unsigned long data)
  523. {
  524. struct floppy_state *fs = (struct floppy_state *) data;
  525. volatile struct swim3 *sw = fs->swim3;
  526. struct dbdma_regs *dr = fs->dma;
  527. struct dbdma_cmd *cp = fs->dma_cmd;
  528. unsigned long s;
  529. fs->timeout_pending = 0;
  530. st_le32(&dr->control, RUN << 16);
  531. out_8(&sw->intr_enable, 0);
  532. out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION);
  533. out_8(&sw->select, RELAX);
  534. if (CURRENT->cmd == WRITE)
  535. ++cp;
  536. if (ld_le16(&cp->xfer_status) != 0)
  537. s = fs->scount - ((ld_le16(&cp->res_count) + 511) >> 9);
  538. else
  539. s = 0;
  540. CURRENT->sector += s;
  541. CURRENT->current_nr_sectors -= s;
  542. printk(KERN_ERR "swim3: timeout %sing sector %ldn",
  543.        (CURRENT->cmd==WRITE? "writ": "read"), CURRENT->sector);
  544. end_request(0);
  545. fs->state = idle;
  546. start_request(fs);
  547. }
  548. static void swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  549. {
  550. struct floppy_state *fs = (struct floppy_state *) dev_id;
  551. volatile struct swim3 *sw = fs->swim3;
  552. int intr, err, n;
  553. int stat, resid;
  554. struct dbdma_regs *dr;
  555. struct dbdma_cmd *cp;
  556. err = in_8(&sw->error);
  557. intr = in_8(&sw->intr);
  558. #if 0
  559. printk("swim3 intr state=%d intr=%x err=%xn", fs->state, intr, err);
  560. #endif
  561. if ((intr & ERROR_INTR) && fs->state != do_transfer)
  562. printk(KERN_ERR "swim3_interrupt, state=%d, cmd=%x, intr=%x, err=%xn",
  563.        fs->state, CURRENT->cmd, intr, err);
  564. switch (fs->state) {
  565. case locating:
  566. if (intr & SEEN_SECTOR) {
  567. out_8(&sw->control_bic, DO_ACTION);
  568. out_8(&sw->select, RELAX);
  569. out_8(&sw->intr_enable, 0);
  570. del_timer(&fs->timeout);
  571. fs->timeout_pending = 0;
  572. if (sw->ctrack == 0xff) {
  573. printk(KERN_ERR "swim3: seen sector but cyl=ff?n");
  574. fs->cur_cyl = -1;
  575. if (fs->retries > 5) {
  576. end_request(0);
  577. fs->state = idle;
  578. start_request(fs);
  579. } else {
  580. fs->state = jogging;
  581. act(fs);
  582. }
  583. break;
  584. }
  585. fs->cur_cyl = sw->ctrack;
  586. fs->cur_sector = sw->csect;
  587. if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl)
  588. printk(KERN_ERR "swim3: expected cyl %d, got %dn",
  589.        fs->expect_cyl, fs->cur_cyl);
  590. fs->state = do_transfer;
  591. act(fs);
  592. }
  593. break;
  594. case seeking:
  595. case jogging:
  596. if (sw->nseek == 0) {
  597. out_8(&sw->control_bic, DO_SEEK);
  598. out_8(&sw->select, RELAX);
  599. out_8(&sw->intr_enable, 0);
  600. del_timer(&fs->timeout);
  601. fs->timeout_pending = 0;
  602. if (fs->state == seeking)
  603. ++fs->retries;
  604. fs->state = settling;
  605. act(fs);
  606. }
  607. break;
  608. case settling:
  609. out_8(&sw->intr_enable, 0);
  610. del_timer(&fs->timeout);
  611. fs->timeout_pending = 0;
  612. act(fs);
  613. break;
  614. case do_transfer:
  615. if ((intr & (ERROR_INTR | TRANSFER_DONE)) == 0)
  616. break;
  617. dr = fs->dma;
  618. cp = fs->dma_cmd;
  619. /* We must wait a bit for dbdma to complete */
  620. for (n=0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++)
  621. udelay(10);
  622. DBDMA_DO_STOP(dr);
  623. out_8(&sw->intr_enable, 0);
  624. out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION);
  625. out_8(&sw->select, RELAX);
  626. del_timer(&fs->timeout);
  627. fs->timeout_pending = 0;
  628. if (CURRENT->cmd == WRITE)
  629. ++cp;
  630. stat = ld_le16(&cp->xfer_status);
  631. resid = ld_le16(&cp->res_count);
  632. if (intr & ERROR_INTR) {
  633. n = fs->scount - 1 - resid / 512;
  634. if (n > 0) {
  635. CURRENT->sector += n;
  636. CURRENT->current_nr_sectors -= n;
  637. CURRENT->buffer += n * 512;
  638. fs->req_sector += n;
  639. }
  640. if (fs->retries < 5) {
  641. ++fs->retries;
  642. act(fs);
  643. } else {
  644. printk("swim3: error %sing block %ld (err=%x)n",
  645.        CURRENT->cmd == WRITE? "writ": "read",
  646.        CURRENT->sector, err);
  647. end_request(0);
  648. fs->state = idle;
  649. }
  650. } else {
  651. if ((stat & ACTIVE) == 0 || resid != 0) {
  652. /* musta been an error */
  653. printk(KERN_ERR "swim3: fd dma: stat=%x resid=%dn", stat, resid);
  654. printk(KERN_ERR "  state=%d, cmd=%x, intr=%x, err=%xn",
  655.        fs->state, CURRENT->cmd, intr, err);
  656. end_request(0);
  657. fs->state = idle;
  658. start_request(fs);
  659. break;
  660. }
  661. CURRENT->sector += fs->scount;
  662. CURRENT->current_nr_sectors -= fs->scount;
  663. CURRENT->buffer += fs->scount * 512;
  664. if (CURRENT->current_nr_sectors <= 0) {
  665. end_request(1);
  666. fs->state = idle;
  667. } else {
  668. fs->req_sector += fs->scount;
  669. if (fs->req_sector > fs->secpertrack) {
  670. fs->req_sector -= fs->secpertrack;
  671. if (++fs->head > 1) {
  672. fs->head = 0;
  673. ++fs->req_cyl;
  674. }
  675. }
  676. act(fs);
  677. }
  678. }
  679. if (fs->state == idle)
  680. start_request(fs);
  681. break;
  682. default:
  683. printk(KERN_ERR "swim3: don't know what to do in state %dn", fs->state);
  684. }
  685. }
  686. /*
  687. static void fd_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  688. {
  689. }
  690. */
  691. static int grab_drive(struct floppy_state *fs, enum swim_state state,
  692.       int interruptible)
  693. {
  694. unsigned long flags;
  695. save_flags(flags);
  696. cli();
  697. if (fs->state != idle) {
  698. ++fs->wanted;
  699. while (fs->state != available) {
  700. if (interruptible && signal_pending(current)) {
  701. --fs->wanted;
  702. restore_flags(flags);
  703. return -EINTR;
  704. }
  705. interruptible_sleep_on(&fs->wait);
  706. }
  707. --fs->wanted;
  708. }
  709. fs->state = state;
  710. restore_flags(flags);
  711. return 0;
  712. }
  713. static void release_drive(struct floppy_state *fs)
  714. {
  715. unsigned long flags;
  716. save_flags(flags);
  717. cli();
  718. fs->state = idle;
  719. start_request(fs);
  720. restore_flags(flags);
  721. }
  722. static int fd_eject(struct floppy_state *fs)
  723. {
  724. int err, n;
  725. err = grab_drive(fs, ejecting, 1);
  726. if (err)
  727. return err;
  728. swim3_action(fs, EJECT);
  729. for (n = 2*HZ; n > 0; --n) {
  730. if (swim3_readbit(fs, RELAX))
  731. break;
  732. if (signal_pending(current)) {
  733. err = -EINTR;
  734. break;
  735. }
  736. current->state = TASK_INTERRUPTIBLE;
  737. schedule_timeout(1);
  738. }
  739. fs->ejected = 1;
  740. release_drive(fs);
  741. return err;
  742. }
  743. int swim3_fd_eject(int devnum)
  744. {
  745. if (devnum >= floppy_count)
  746. return -ENODEV;
  747. /* Do not check this - this function should ONLY be called early
  748.  * in the boot process! */
  749. /* if (floppy_states[devnum].ref_count != 1) return -EBUSY; */
  750. return fd_eject(&floppy_states[devnum]);
  751. }
  752. static struct floppy_struct floppy_type =
  753. { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /*  7 1.44MB 3.5"   */
  754. static int floppy_ioctl(struct inode *inode, struct file *filp,
  755. unsigned int cmd, unsigned long param)
  756. {
  757. struct floppy_state *fs;
  758. int err;
  759. int devnum = MINOR(inode->i_rdev);
  760. if (devnum >= floppy_count)
  761. return -ENODEV;
  762. if ((cmd & 0x80) && !suser())
  763. return -EPERM;
  764. fs = &floppy_states[devnum];
  765. if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
  766. return -ENXIO;
  767. switch (cmd) {
  768. case FDEJECT:
  769. if (fs->ref_count != 1)
  770. return -EBUSY;
  771. err = fd_eject(fs);
  772. return err;
  773. case FDGETPRM:
  774.         err = copy_to_user((void *) param, (void *) &floppy_type,
  775.    sizeof(struct floppy_struct));
  776. return err;
  777. }
  778. return -ENOTTY;
  779. }
  780. static int floppy_open(struct inode *inode, struct file *filp)
  781. {
  782. struct floppy_state *fs;
  783. volatile struct swim3 *sw;
  784. int n, err;
  785. int devnum = MINOR(inode->i_rdev);
  786. if (devnum >= floppy_count)
  787. return -ENODEV;
  788. if (filp == 0)
  789. return -EIO;
  790. fs = &floppy_states[devnum];
  791. sw = fs->swim3;
  792. err = 0;
  793. if (fs->ref_count == 0) {
  794. if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
  795. return -ENXIO;
  796. out_8(&sw->mode, 0x95);
  797. out_8(&sw->control_bic, 0xff);
  798. out_8(&sw->setup, S_IBM_DRIVE | S_FCLK_DIV2);
  799. udelay(10);
  800. out_8(&sw->intr_enable, 0);
  801. out_8(&sw->control_bis, DRIVE_ENABLE | INTR_ENABLE);
  802. swim3_action(fs, MOTOR_ON);
  803. fs->write_prot = -1;
  804. fs->cur_cyl = -1;
  805. for (n = HZ; n > 0; --n) {
  806. if (swim3_readbit(fs, SEEK_COMPLETE))
  807. break;
  808. if (signal_pending(current)) {
  809. err = -EINTR;
  810. break;
  811. }
  812. current->state = TASK_INTERRUPTIBLE;
  813. schedule_timeout(1);
  814. }
  815. if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0
  816.  || swim3_readbit(fs, DISK_IN) == 0))
  817. err = -ENXIO;
  818. swim3_action(fs, 9);
  819. } else if (fs->ref_count == -1 || filp->f_flags & O_EXCL)
  820. return -EBUSY;
  821. if (err == 0 && (filp->f_flags & O_NDELAY) == 0
  822.     && (filp->f_mode & 3)) {
  823. check_disk_change(inode->i_rdev);
  824. if (fs->ejected)
  825. err = -ENXIO;
  826. }
  827. if (err == 0 && (filp->f_mode & 2)) {
  828. if (fs->write_prot < 0)
  829. fs->write_prot = swim3_readbit(fs, WRITE_PROT);
  830. if (fs->write_prot)
  831. err = -EROFS;
  832. }
  833. if (err) {
  834. if (fs->ref_count == 0) {
  835. swim3_action(fs, MOTOR_OFF);
  836. out_8(&sw->control_bic, DRIVE_ENABLE | INTR_ENABLE);
  837. }
  838. return err;
  839. }
  840. if (filp->f_flags & O_EXCL)
  841. fs->ref_count = -1;
  842. else
  843. ++fs->ref_count;
  844. return 0;
  845. }
  846. static int floppy_release(struct inode *inode, struct file *filp)
  847. {
  848. struct floppy_state *fs;
  849. volatile struct swim3 *sw;
  850. int devnum = MINOR(inode->i_rdev);
  851. if (devnum >= floppy_count)
  852. return -ENODEV;
  853. fs = &floppy_states[devnum];
  854. sw = fs->swim3;
  855. if (fs->ref_count > 0 && --fs->ref_count == 0) {
  856. swim3_action(fs, MOTOR_OFF);
  857. out_8(&sw->control_bic, 0xff);
  858. }
  859. return 0;
  860. }
  861. static int floppy_check_change(kdev_t dev)
  862. {
  863. struct floppy_state *fs;
  864. int devnum = MINOR(dev);
  865. if (MAJOR(dev) != MAJOR_NR || (devnum >= floppy_count))
  866. return 0;
  867. fs = &floppy_states[devnum];
  868. return fs->ejected;
  869. }
  870. static int floppy_revalidate(kdev_t dev)
  871. {
  872. struct floppy_state *fs;
  873. volatile struct swim3 *sw;
  874. int ret, n;
  875. int devnum = MINOR(dev);
  876. if (MAJOR(dev) != MAJOR_NR || (devnum >= floppy_count))
  877. return 0;
  878. fs = &floppy_states[devnum];
  879. if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
  880. return -ENXIO;
  881. sw = fs->swim3;
  882. grab_drive(fs, revalidating, 0);
  883. out_8(&sw->intr_enable, 0);
  884. out_8(&sw->control_bis, DRIVE_ENABLE | INTR_ENABLE);
  885. swim3_action(fs, MOTOR_ON);
  886. fs->write_prot = -1;
  887. fs->cur_cyl = -1;
  888. for (n = HZ; n > 0; --n) {
  889. if (swim3_readbit(fs, SEEK_COMPLETE))
  890. break;
  891. if (signal_pending(current))
  892. break;
  893. current->state = TASK_INTERRUPTIBLE;
  894. schedule_timeout(1);
  895. }
  896. ret = swim3_readbit(fs, SEEK_COMPLETE) == 0
  897. || swim3_readbit(fs, DISK_IN) == 0;
  898. if (ret)
  899. swim3_action(fs, MOTOR_OFF);
  900. else {
  901. fs->ejected = 0;
  902. swim3_action(fs, 9);
  903. }
  904. release_drive(fs);
  905. return ret;
  906. }
  907. static void floppy_off(unsigned int nr)
  908. {
  909. }
  910. static struct block_device_operations floppy_fops = {
  911. open: floppy_open,
  912. release: floppy_release,
  913. ioctl: floppy_ioctl,
  914. check_media_change: floppy_check_change,
  915. revalidate: floppy_revalidate,
  916. };
  917. static devfs_handle_t floppy_devfs_handle;
  918. int swim3_init(void)
  919. {
  920. struct device_node *swim;
  921. floppy_devfs_handle = devfs_mk_dir(NULL, "floppy", NULL);
  922. swim = find_devices("floppy");
  923. while (swim && (floppy_count < MAX_FLOPPIES))
  924. {
  925. swim3_add_device(swim);
  926. swim = swim->next;
  927. }
  928. swim = find_devices("swim3");
  929. while (swim && (floppy_count < MAX_FLOPPIES))
  930. {
  931. swim3_add_device(swim);
  932. swim = swim->next;
  933. }
  934. if (floppy_count > 0)
  935. {
  936. if (devfs_register_blkdev(MAJOR_NR, "fd", &floppy_fops)) {
  937. printk(KERN_ERR "Unable to get major %d for floppyn",
  938.        MAJOR_NR);
  939. return -EBUSY;
  940. }
  941. blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
  942. blksize_size[MAJOR_NR] = floppy_blocksizes;
  943. blk_size[MAJOR_NR] = floppy_sizes;
  944. }
  945. return 0;
  946. }
  947. static int swim3_add_device(struct device_node *swim)
  948. {
  949. struct device_node *mediabay;
  950. struct floppy_state *fs = &floppy_states[floppy_count];
  951. char floppy_name[16];
  952. devfs_handle_t floppy_handle;
  953. if (swim->n_addrs < 2)
  954. {
  955. printk(KERN_INFO "swim3: expecting 2 addrs (n_addrs:%d, n_intrs:%d)n",
  956.        swim->n_addrs, swim->n_intrs);
  957. return -EINVAL;
  958. }
  959. if (swim->n_intrs < 2)
  960. {
  961. printk(KERN_INFO "swim3: expecting 2 intrs (n_addrs:%d, n_intrs:%d)n",
  962.        swim->n_addrs, swim->n_intrs);
  963. return -EINVAL;
  964. }
  965. if (!request_OF_resource(swim, 0, NULL)) {
  966. printk(KERN_INFO "swim3: can't request IO resource !n");
  967. return -EINVAL;
  968. }
  969. mediabay = (strcasecmp(swim->parent->type, "media-bay") == 0) ? swim->parent : NULL;
  970. if (mediabay == NULL)
  971. pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1);
  972. memset(fs, 0, sizeof(*fs));
  973. fs->state = idle;
  974. fs->swim3 = (volatile struct swim3 *) ioremap(swim->addrs[0].address, 0x200);
  975. fs->dma = (struct dbdma_regs *) ioremap(swim->addrs[1].address, 0x200);
  976. fs->swim3_intr = swim->intrs[0].line;
  977. fs->dma_intr = swim->intrs[1].line;
  978. fs->cur_cyl = -1;
  979. fs->cur_sector = -1;
  980. fs->secpercyl = 36;
  981. fs->secpertrack = 18;
  982. fs->total_secs = 2880;
  983. fs->media_bay = mediabay;
  984. init_waitqueue_head(&fs->wait);
  985. fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space);
  986. memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd));
  987. st_le16(&fs->dma_cmd[1].command, DBDMA_STOP);
  988. if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) {
  989. printk(KERN_ERR "Couldn't get irq %d for SWIM3n", fs->swim3_intr);
  990. pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0);
  991. return -EBUSY;
  992. }
  993. /*
  994. if (request_irq(fs->dma_intr, fd_dma_interrupt, 0, "SWIM3-dma", fs)) {
  995. printk(KERN_ERR "Couldn't get irq %d for SWIM3 DMA",
  996.        fs->dma_intr);
  997. pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0);
  998. return -EBUSY;
  999. }
  1000. */
  1001. init_timer(&fs->timeout);
  1002. do_floppy = NULL;
  1003. printk(KERN_INFO "fd%d: SWIM3 floppy controller %sn", floppy_count,
  1004. mediabay ? "in media bay" : "");
  1005. sprintf(floppy_name, "%s%d", floppy_devfs_handle ? "" : "floppy",
  1006. floppy_count);
  1007. floppy_handle = devfs_register(floppy_devfs_handle, floppy_name, 
  1008. DEVFS_FL_DEFAULT, MAJOR_NR, floppy_count, 
  1009. S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP, 
  1010. &floppy_fops, NULL);
  1011. floppy_count++;
  1012. return 0;
  1013. }