linux/drivers/block/swim3.c
<<
>>
Prefs
   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/*
  14 * TODO:
  15 * handle 2 drives
  16 * handle GCR disks
  17 */
  18
  19#include <linux/stddef.h>
  20#include <linux/kernel.h>
  21#include <linux/sched.h>
  22#include <linux/timer.h>
  23#include <linux/delay.h>
  24#include <linux/fd.h>
  25#include <linux/ioctl.h>
  26#include <linux/blkdev.h>
  27#include <linux/interrupt.h>
  28#include <linux/module.h>
  29#include <linux/spinlock.h>
  30#include <asm/io.h>
  31#include <asm/dbdma.h>
  32#include <asm/prom.h>
  33#include <asm/uaccess.h>
  34#include <asm/mediabay.h>
  35#include <asm/machdep.h>
  36#include <asm/pmac_feature.h>
  37
  38static struct request_queue *swim3_queue;
  39static struct gendisk *disks[2];
  40static struct request *fd_req;
  41
  42#define MAX_FLOPPIES    2
  43
  44enum swim_state {
  45        idle,
  46        locating,
  47        seeking,
  48        settling,
  49        do_transfer,
  50        jogging,
  51        available,
  52        revalidating,
  53        ejecting
  54};
  55
  56#define REG(x)  unsigned char x; char x ## _pad[15];
  57
  58/*
  59 * The names for these registers mostly represent speculation on my part.
  60 * It will be interesting to see how close they are to the names Apple uses.
  61 */
  62struct swim3 {
  63        REG(data);
  64        REG(timer);             /* counts down at 1MHz */
  65        REG(error);
  66        REG(mode);
  67        REG(select);            /* controls CA0, CA1, CA2 and LSTRB signals */
  68        REG(setup);
  69        REG(control);           /* writing bits clears them */
  70        REG(status);            /* writing bits sets them in control */
  71        REG(intr);
  72        REG(nseek);             /* # tracks to seek */
  73        REG(ctrack);            /* current track number */
  74        REG(csect);             /* current sector number */
  75        REG(gap3);              /* size of gap 3 in track format */
  76        REG(sector);            /* sector # to read or write */
  77        REG(nsect);             /* # sectors to read or write */
  78        REG(intr_enable);
  79};
  80
  81#define control_bic     control
  82#define control_bis     status
  83
  84/* Bits in select register */
  85#define CA_MASK         7
  86#define LSTRB           8
  87
  88/* Bits in control register */
  89#define DO_SEEK         0x80
  90#define FORMAT          0x40
  91#define SELECT          0x20
  92#define WRITE_SECTORS   0x10
  93#define DO_ACTION       0x08
  94#define DRIVE2_ENABLE   0x04
  95#define DRIVE_ENABLE    0x02
  96#define INTR_ENABLE     0x01
  97
  98/* Bits in status register */
  99#define FIFO_1BYTE      0x80
 100#define FIFO_2BYTE      0x40
 101#define ERROR           0x20
 102#define DATA            0x08
 103#define RDDATA          0x04
 104#define INTR_PENDING    0x02
 105#define MARK_BYTE       0x01
 106
 107/* Bits in intr and intr_enable registers */
 108#define ERROR_INTR      0x20
 109#define DATA_CHANGED    0x10
 110#define TRANSFER_DONE   0x08
 111#define SEEN_SECTOR     0x04
 112#define SEEK_DONE       0x02
 113#define TIMER_DONE      0x01
 114
 115/* Bits in error register */
 116#define ERR_DATA_CRC    0x80
 117#define ERR_ADDR_CRC    0x40
 118#define ERR_OVERRUN     0x04
 119#define ERR_UNDERRUN    0x01
 120
 121/* Bits in setup register */
 122#define S_SW_RESET      0x80
 123#define S_GCR_WRITE     0x40
 124#define S_IBM_DRIVE     0x20
 125#define S_TEST_MODE     0x10
 126#define S_FCLK_DIV2     0x08
 127#define S_GCR           0x04
 128#define S_COPY_PROT     0x02
 129#define S_INV_WDATA     0x01
 130
 131/* Select values for swim3_action */
 132#define SEEK_POSITIVE   0
 133#define SEEK_NEGATIVE   4
 134#define STEP            1
 135#define MOTOR_ON        2
 136#define MOTOR_OFF       6
 137#define INDEX           3
 138#define EJECT           7
 139#define SETMFM          9
 140#define SETGCR          13
 141
 142/* Select values for swim3_select and swim3_readbit */
 143#define STEP_DIR        0
 144#define STEPPING        1
 145#define MOTOR_ON        2
 146#define RELAX           3       /* also eject in progress */
 147#define READ_DATA_0     4
 148#define TWOMEG_DRIVE    5
 149#define SINGLE_SIDED    6       /* drive or diskette is 4MB type? */
 150#define DRIVE_PRESENT   7
 151#define DISK_IN         8
 152#define WRITE_PROT      9
 153#define TRACK_ZERO      10
 154#define TACHO           11
 155#define READ_DATA_1     12
 156#define MFM_MODE        13
 157#define SEEK_COMPLETE   14
 158#define ONEMEG_MEDIA    15
 159
 160/* Definitions of values used in writing and formatting */
 161#define DATA_ESCAPE     0x99
 162#define GCR_SYNC_EXC    0x3f
 163#define GCR_SYNC_CONV   0x80
 164#define GCR_FIRST_MARK  0xd5
 165#define GCR_SECOND_MARK 0xaa
 166#define GCR_ADDR_MARK   "\xd5\xaa\x00"
 167#define GCR_DATA_MARK   "\xd5\xaa\x0b"
 168#define GCR_SLIP_BYTE   "\x27\xaa"
 169#define GCR_SELF_SYNC   "\x3f\xbf\x1e\x34\x3c\x3f"
 170
 171#define DATA_99         "\x99\x99"
 172#define MFM_ADDR_MARK   "\x99\xa1\x99\xa1\x99\xa1\x99\xfe"
 173#define MFM_INDEX_MARK  "\x99\xc2\x99\xc2\x99\xc2\x99\xfc"
 174#define MFM_GAP_LEN     12
 175
 176struct floppy_state {
 177        enum swim_state state;
 178        spinlock_t lock;
 179        struct swim3 __iomem *swim3;    /* hardware registers */
 180        struct dbdma_regs __iomem *dma; /* DMA controller registers */
 181        int     swim3_intr;     /* interrupt number for SWIM3 */
 182        int     dma_intr;       /* interrupt number for DMA channel */
 183        int     cur_cyl;        /* cylinder head is on, or -1 */
 184        int     cur_sector;     /* last sector we saw go past */
 185        int     req_cyl;        /* the cylinder for the current r/w request */
 186        int     head;           /* head number ditto */
 187        int     req_sector;     /* sector number ditto */
 188        int     scount;         /* # sectors we're transferring at present */
 189        int     retries;
 190        int     settle_time;
 191        int     secpercyl;      /* disk geometry information */
 192        int     secpertrack;
 193        int     total_secs;
 194        int     write_prot;     /* 1 if write-protected, 0 if not, -1 dunno */
 195        struct dbdma_cmd *dma_cmd;
 196        int     ref_count;
 197        int     expect_cyl;
 198        struct timer_list timeout;
 199        int     timeout_pending;
 200        int     ejected;
 201        wait_queue_head_t wait;
 202        int     wanted;
 203        struct device_node*     media_bay; /* NULL when not in bay */
 204        char    dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)];
 205};
 206
 207static struct floppy_state floppy_states[MAX_FLOPPIES];
 208static int floppy_count = 0;
 209static DEFINE_SPINLOCK(swim3_lock);
 210
 211static unsigned short write_preamble[] = {
 212        0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, /* gap field */
 213        0, 0, 0, 0, 0, 0,                       /* sync field */
 214        0x99a1, 0x99a1, 0x99a1, 0x99fb,         /* data address mark */
 215        0x990f                                  /* no escape for 512 bytes */
 216};
 217
 218static unsigned short write_postamble[] = {
 219        0x9904,                                 /* insert CRC */
 220        0x4e4e, 0x4e4e,
 221        0x9908,                                 /* stop writing */
 222        0, 0, 0, 0, 0, 0
 223};
 224
 225static void swim3_select(struct floppy_state *fs, int sel);
 226static void swim3_action(struct floppy_state *fs, int action);
 227static int swim3_readbit(struct floppy_state *fs, int bit);
 228static void do_fd_request(struct request_queue * q);
 229static void start_request(struct floppy_state *fs);
 230static void set_timeout(struct floppy_state *fs, int nticks,
 231                        void (*proc)(unsigned long));
 232static void scan_track(struct floppy_state *fs);
 233static void seek_track(struct floppy_state *fs, int n);
 234static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count);
 235static void setup_transfer(struct floppy_state *fs);
 236static void act(struct floppy_state *fs);
 237static void scan_timeout(unsigned long data);
 238static void seek_timeout(unsigned long data);
 239static void settle_timeout(unsigned long data);
 240static void xfer_timeout(unsigned long data);
 241static irqreturn_t swim3_interrupt(int irq, void *dev_id);
 242/*static void fd_dma_interrupt(int irq, void *dev_id);*/
 243static int grab_drive(struct floppy_state *fs, enum swim_state state,
 244                      int interruptible);
 245static void release_drive(struct floppy_state *fs);
 246static int fd_eject(struct floppy_state *fs);
 247static int floppy_ioctl(struct inode *inode, struct file *filp,
 248                        unsigned int cmd, unsigned long param);
 249static int floppy_open(struct inode *inode, struct file *filp);
 250static int floppy_release(struct inode *inode, struct file *filp);
 251static int floppy_check_change(struct gendisk *disk);
 252static int floppy_revalidate(struct gendisk *disk);
 253
 254static void swim3_select(struct floppy_state *fs, int sel)
 255{
 256        struct swim3 __iomem *sw = fs->swim3;
 257
 258        out_8(&sw->select, RELAX);
 259        if (sel & 8)
 260                out_8(&sw->control_bis, SELECT);
 261        else
 262                out_8(&sw->control_bic, SELECT);
 263        out_8(&sw->select, sel & CA_MASK);
 264}
 265
 266static void swim3_action(struct floppy_state *fs, int action)
 267{
 268        struct swim3 __iomem *sw = fs->swim3;
 269
 270        swim3_select(fs, action);
 271        udelay(1);
 272        out_8(&sw->select, sw->select | LSTRB);
 273        udelay(2);
 274        out_8(&sw->select, sw->select & ~LSTRB);
 275        udelay(1);
 276}
 277
 278static int swim3_readbit(struct floppy_state *fs, int bit)
 279{
 280        struct swim3 __iomem *sw = fs->swim3;
 281        int stat;
 282
 283        swim3_select(fs, bit);
 284        udelay(1);
 285        stat = in_8(&sw->status);
 286        return (stat & DATA) == 0;
 287}
 288
 289static void do_fd_request(struct request_queue * q)
 290{
 291        int i;
 292        for(i=0;i<floppy_count;i++)
 293        {
 294#ifdef CONFIG_PMAC_MEDIABAY
 295                if (floppy_states[i].media_bay &&
 296                        check_media_bay(floppy_states[i].media_bay, MB_FD))
 297                        continue;
 298#endif /* CONFIG_PMAC_MEDIABAY */
 299                start_request(&floppy_states[i]);
 300        }
 301}
 302
 303static void start_request(struct floppy_state *fs)
 304{
 305        struct request *req;
 306        unsigned long x;
 307
 308        if (fs->state == idle && fs->wanted) {
 309                fs->state = available;
 310                wake_up(&fs->wait);
 311                return;
 312        }
 313        while (fs->state == idle && (req = elv_next_request(swim3_queue))) {
 314#if 0
 315                printk("do_fd_req: dev=%s cmd=%d sec=%ld nr_sec=%ld buf=%p\n",
 316                       req->rq_disk->disk_name, req->cmd,
 317                       (long)req->sector, req->nr_sectors, req->buffer);
 318                printk("           errors=%d current_nr_sectors=%ld\n",
 319                       req->errors, req->current_nr_sectors);
 320#endif
 321
 322                if (req->sector < 0 || req->sector >= fs->total_secs) {
 323                        end_request(req, 0);
 324                        continue;
 325                }
 326                if (req->current_nr_sectors == 0) {
 327                        end_request(req, 1);
 328                        continue;
 329                }
 330                if (fs->ejected) {
 331                        end_request(req, 0);
 332                        continue;
 333                }
 334
 335                if (rq_data_dir(req) == WRITE) {
 336                        if (fs->write_prot < 0)
 337                                fs->write_prot = swim3_readbit(fs, WRITE_PROT);
 338                        if (fs->write_prot) {
 339                                end_request(req, 0);
 340                                continue;
 341                        }
 342                }
 343
 344                /* Do not remove the cast. req->sector is now a sector_t and
 345                 * can be 64 bits, but it will never go past 32 bits for this
 346                 * driver anyway, so we can safely cast it down and not have
 347                 * to do a 64/32 division
 348                 */
 349                fs->req_cyl = ((long)req->sector) / fs->secpercyl;
 350                x = ((long)req->sector) % fs->secpercyl;
 351                fs->head = x / fs->secpertrack;
 352                fs->req_sector = x % fs->secpertrack + 1;
 353                fd_req = req;
 354                fs->state = do_transfer;
 355                fs->retries = 0;
 356
 357                act(fs);
 358        }
 359}
 360
 361static void set_timeout(struct floppy_state *fs, int nticks,
 362                        void (*proc)(unsigned long))
 363{
 364        unsigned long flags;
 365
 366        spin_lock_irqsave(&fs->lock, flags);
 367        if (fs->timeout_pending)
 368                del_timer(&fs->timeout);
 369        fs->timeout.expires = jiffies + nticks;
 370        fs->timeout.function = proc;
 371        fs->timeout.data = (unsigned long) fs;
 372        add_timer(&fs->timeout);
 373        fs->timeout_pending = 1;
 374        spin_unlock_irqrestore(&fs->lock, flags);
 375}
 376
 377static inline void scan_track(struct floppy_state *fs)
 378{
 379        struct swim3 __iomem *sw = fs->swim3;
 380
 381        swim3_select(fs, READ_DATA_0);
 382        in_8(&sw->intr);                /* clear SEEN_SECTOR bit */
 383        in_8(&sw->error);
 384        out_8(&sw->intr_enable, SEEN_SECTOR);
 385        out_8(&sw->control_bis, DO_ACTION);
 386        /* enable intr when track found */
 387        set_timeout(fs, HZ, scan_timeout);      /* enable timeout */
 388}
 389
 390static inline void seek_track(struct floppy_state *fs, int n)
 391{
 392        struct swim3 __iomem *sw = fs->swim3;
 393
 394        if (n >= 0) {
 395                swim3_action(fs, SEEK_POSITIVE);
 396                sw->nseek = n;
 397        } else {
 398                swim3_action(fs, SEEK_NEGATIVE);
 399                sw->nseek = -n;
 400        }
 401        fs->expect_cyl = (fs->cur_cyl >= 0)? fs->cur_cyl + n: -1;
 402        swim3_select(fs, STEP);
 403        in_8(&sw->error);
 404        /* enable intr when seek finished */
 405        out_8(&sw->intr_enable, SEEK_DONE);
 406        out_8(&sw->control_bis, DO_SEEK);
 407        set_timeout(fs, 3*HZ, seek_timeout);    /* enable timeout */
 408        fs->settle_time = 0;
 409}
 410
 411static inline void init_dma(struct dbdma_cmd *cp, int cmd,
 412                            void *buf, int count)
 413{
 414        st_le16(&cp->req_count, count);
 415        st_le16(&cp->command, cmd);
 416        st_le32(&cp->phy_addr, virt_to_bus(buf));
 417        cp->xfer_status = 0;
 418}
 419
 420static inline void setup_transfer(struct floppy_state *fs)
 421{
 422        int n;
 423        struct swim3 __iomem *sw = fs->swim3;
 424        struct dbdma_cmd *cp = fs->dma_cmd;
 425        struct dbdma_regs __iomem *dr = fs->dma;
 426
 427        if (fd_req->current_nr_sectors <= 0) {
 428                printk(KERN_ERR "swim3: transfer 0 sectors?\n");
 429                return;
 430        }
 431        if (rq_data_dir(fd_req) == WRITE)
 432                n = 1;
 433        else {
 434                n = fs->secpertrack - fs->req_sector + 1;
 435                if (n > fd_req->current_nr_sectors)
 436                        n = fd_req->current_nr_sectors;
 437        }
 438        fs->scount = n;
 439        swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0);
 440        out_8(&sw->sector, fs->req_sector);
 441        out_8(&sw->nsect, n);
 442        out_8(&sw->gap3, 0);
 443        out_le32(&dr->cmdptr, virt_to_bus(cp));
 444        if (rq_data_dir(fd_req) == WRITE) {
 445                /* Set up 3 dma commands: write preamble, data, postamble */
 446                init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble));
 447                ++cp;
 448                init_dma(cp, OUTPUT_MORE, fd_req->buffer, 512);
 449                ++cp;
 450                init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble));
 451        } else {
 452                init_dma(cp, INPUT_LAST, fd_req->buffer, n * 512);
 453        }
 454        ++cp;
 455        out_le16(&cp->command, DBDMA_STOP);
 456        out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
 457        in_8(&sw->error);
 458        out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
 459        if (rq_data_dir(fd_req) == WRITE)
 460                out_8(&sw->control_bis, WRITE_SECTORS);
 461        in_8(&sw->intr);
 462        out_le32(&dr->control, (RUN << 16) | RUN);
 463        /* enable intr when transfer complete */
 464        out_8(&sw->intr_enable, TRANSFER_DONE);
 465        out_8(&sw->control_bis, DO_ACTION);
 466        set_timeout(fs, 2*HZ, xfer_timeout);    /* enable timeout */
 467}
 468
 469static void act(struct floppy_state *fs)
 470{
 471        for (;;) {
 472                switch (fs->state) {
 473                case idle:
 474                        return;         /* XXX shouldn't get here */
 475
 476                case locating:
 477                        if (swim3_readbit(fs, TRACK_ZERO)) {
 478                                fs->cur_cyl = 0;
 479                                if (fs->req_cyl == 0)
 480                                        fs->state = do_transfer;
 481                                else
 482                                        fs->state = seeking;
 483                                break;
 484                        }
 485                        scan_track(fs);
 486                        return;
 487
 488                case seeking:
 489                        if (fs->cur_cyl < 0) {
 490                                fs->expect_cyl = -1;
 491                                fs->state = locating;
 492                                break;
 493                        }
 494                        if (fs->req_cyl == fs->cur_cyl) {
 495                                printk("whoops, seeking 0\n");
 496                                fs->state = do_transfer;
 497                                break;
 498                        }
 499                        seek_track(fs, fs->req_cyl - fs->cur_cyl);
 500                        return;
 501
 502                case settling:
 503                        /* check for SEEK_COMPLETE after 30ms */
 504                        fs->settle_time = (HZ + 32) / 33;
 505                        set_timeout(fs, fs->settle_time, settle_timeout);
 506                        return;
 507
 508                case do_transfer:
 509                        if (fs->cur_cyl != fs->req_cyl) {
 510                                if (fs->retries > 5) {
 511                                        end_request(fd_req, 0);
 512                                        fs->state = idle;
 513                                        return;
 514                                }
 515                                fs->state = seeking;
 516                                break;
 517                        }
 518                        setup_transfer(fs);
 519                        return;
 520
 521                case jogging:
 522                        seek_track(fs, -5);
 523                        return;
 524
 525                default:
 526                        printk(KERN_ERR"swim3: unknown state %d\n", fs->state);
 527                        return;
 528                }
 529        }
 530}
 531
 532static void scan_timeout(unsigned long data)
 533{
 534        struct floppy_state *fs = (struct floppy_state *) data;
 535        struct swim3 __iomem *sw = fs->swim3;
 536
 537        fs->timeout_pending = 0;
 538        out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
 539        out_8(&sw->select, RELAX);
 540        out_8(&sw->intr_enable, 0);
 541        fs->cur_cyl = -1;
 542        if (fs->retries > 5) {
 543                end_request(fd_req, 0);
 544                fs->state = idle;
 545                start_request(fs);
 546        } else {
 547                fs->state = jogging;
 548                act(fs);
 549        }
 550}
 551
 552static void seek_timeout(unsigned long data)
 553{
 554        struct floppy_state *fs = (struct floppy_state *) data;
 555        struct swim3 __iomem *sw = fs->swim3;
 556
 557        fs->timeout_pending = 0;
 558        out_8(&sw->control_bic, DO_SEEK);
 559        out_8(&sw->select, RELAX);
 560        out_8(&sw->intr_enable, 0);
 561        printk(KERN_ERR "swim3: seek timeout\n");
 562        end_request(fd_req, 0);
 563        fs->state = idle;
 564        start_request(fs);
 565}
 566
 567static void settle_timeout(unsigned long data)
 568{
 569        struct floppy_state *fs = (struct floppy_state *) data;
 570        struct swim3 __iomem *sw = fs->swim3;
 571
 572        fs->timeout_pending = 0;
 573        if (swim3_readbit(fs, SEEK_COMPLETE)) {
 574                out_8(&sw->select, RELAX);
 575                fs->state = locating;
 576                act(fs);
 577                return;
 578        }
 579        out_8(&sw->select, RELAX);
 580        if (fs->settle_time < 2*HZ) {
 581                ++fs->settle_time;
 582                set_timeout(fs, 1, settle_timeout);
 583                return;
 584        }
 585        printk(KERN_ERR "swim3: seek settle timeout\n");
 586        end_request(fd_req, 0);
 587        fs->state = idle;
 588        start_request(fs);
 589}
 590
 591static void xfer_timeout(unsigned long data)
 592{
 593        struct floppy_state *fs = (struct floppy_state *) data;
 594        struct swim3 __iomem *sw = fs->swim3;
 595        struct dbdma_regs __iomem *dr = fs->dma;
 596        struct dbdma_cmd *cp = fs->dma_cmd;
 597        unsigned long s;
 598        int n;
 599
 600        fs->timeout_pending = 0;
 601        out_le32(&dr->control, RUN << 16);
 602        /* We must wait a bit for dbdma to stop */
 603        for (n = 0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++)
 604                udelay(1);
 605        out_8(&sw->intr_enable, 0);
 606        out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION);
 607        out_8(&sw->select, RELAX);
 608        if (rq_data_dir(fd_req) == WRITE)
 609                ++cp;
 610        if (ld_le16(&cp->xfer_status) != 0)
 611                s = fs->scount - ((ld_le16(&cp->res_count) + 511) >> 9);
 612        else
 613                s = 0;
 614        fd_req->sector += s;
 615        fd_req->current_nr_sectors -= s;
 616        printk(KERN_ERR "swim3: timeout %sing sector %ld\n",
 617               (rq_data_dir(fd_req)==WRITE? "writ": "read"), (long)fd_req->sector);
 618        end_request(fd_req, 0);
 619        fs->state = idle;
 620        start_request(fs);
 621}
 622
 623static irqreturn_t swim3_interrupt(int irq, void *dev_id)
 624{
 625        struct floppy_state *fs = (struct floppy_state *) dev_id;
 626        struct swim3 __iomem *sw = fs->swim3;
 627        int intr, err, n;
 628        int stat, resid;
 629        struct dbdma_regs __iomem *dr;
 630        struct dbdma_cmd *cp;
 631
 632        intr = in_8(&sw->intr);
 633        err = (intr & ERROR_INTR)? in_8(&sw->error): 0;
 634        if ((intr & ERROR_INTR) && fs->state != do_transfer)
 635                printk(KERN_ERR "swim3_interrupt, state=%d, dir=%x, intr=%x, err=%x\n",
 636                       fs->state, rq_data_dir(fd_req), intr, err);
 637        switch (fs->state) {
 638        case locating:
 639                if (intr & SEEN_SECTOR) {
 640                        out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
 641                        out_8(&sw->select, RELAX);
 642                        out_8(&sw->intr_enable, 0);
 643                        del_timer(&fs->timeout);
 644                        fs->timeout_pending = 0;
 645                        if (sw->ctrack == 0xff) {
 646                                printk(KERN_ERR "swim3: seen sector but cyl=ff?\n");
 647                                fs->cur_cyl = -1;
 648                                if (fs->retries > 5) {
 649                                        end_request(fd_req, 0);
 650                                        fs->state = idle;
 651                                        start_request(fs);
 652                                } else {
 653                                        fs->state = jogging;
 654                                        act(fs);
 655                                }
 656                                break;
 657                        }
 658                        fs->cur_cyl = sw->ctrack;
 659                        fs->cur_sector = sw->csect;
 660                        if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl)
 661                                printk(KERN_ERR "swim3: expected cyl %d, got %d\n",
 662                                       fs->expect_cyl, fs->cur_cyl);
 663                        fs->state = do_transfer;
 664                        act(fs);
 665                }
 666                break;
 667        case seeking:
 668        case jogging:
 669                if (sw->nseek == 0) {
 670                        out_8(&sw->control_bic, DO_SEEK);
 671                        out_8(&sw->select, RELAX);
 672                        out_8(&sw->intr_enable, 0);
 673                        del_timer(&fs->timeout);
 674                        fs->timeout_pending = 0;
 675                        if (fs->state == seeking)
 676                                ++fs->retries;
 677                        fs->state = settling;
 678                        act(fs);
 679                }
 680                break;
 681        case settling:
 682                out_8(&sw->intr_enable, 0);
 683                del_timer(&fs->timeout);
 684                fs->timeout_pending = 0;
 685                act(fs);
 686                break;
 687        case do_transfer:
 688                if ((intr & (ERROR_INTR | TRANSFER_DONE)) == 0)
 689                        break;
 690                out_8(&sw->intr_enable, 0);
 691                out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION);
 692                out_8(&sw->select, RELAX);
 693                del_timer(&fs->timeout);
 694                fs->timeout_pending = 0;
 695                dr = fs->dma;
 696                cp = fs->dma_cmd;
 697                if (rq_data_dir(fd_req) == WRITE)
 698                        ++cp;
 699                /*
 700                 * Check that the main data transfer has finished.
 701                 * On writing, the swim3 sometimes doesn't use
 702                 * up all the bytes of the postamble, so we can still
 703                 * see DMA active here.  That doesn't matter as long
 704                 * as all the sector data has been transferred.
 705                 */
 706                if ((intr & ERROR_INTR) == 0 && cp->xfer_status == 0) {
 707                        /* wait a little while for DMA to complete */
 708                        for (n = 0; n < 100; ++n) {
 709                                if (cp->xfer_status != 0)
 710                                        break;
 711                                udelay(1);
 712                                barrier();
 713                        }
 714                }
 715                /* turn off DMA */
 716                out_le32(&dr->control, (RUN | PAUSE) << 16);
 717                stat = ld_le16(&cp->xfer_status);
 718                resid = ld_le16(&cp->res_count);
 719                if (intr & ERROR_INTR) {
 720                        n = fs->scount - 1 - resid / 512;
 721                        if (n > 0) {
 722                                fd_req->sector += n;
 723                                fd_req->current_nr_sectors -= n;
 724                                fd_req->buffer += n * 512;
 725                                fs->req_sector += n;
 726                        }
 727                        if (fs->retries < 5) {
 728                                ++fs->retries;
 729                                act(fs);
 730                        } else {
 731                                printk("swim3: error %sing block %ld (err=%x)\n",
 732                                       rq_data_dir(fd_req) == WRITE? "writ": "read",
 733                                       (long)fd_req->sector, err);
 734                                end_request(fd_req, 0);
 735                                fs->state = idle;
 736                        }
 737                } else {
 738                        if ((stat & ACTIVE) == 0 || resid != 0) {
 739                                /* musta been an error */
 740                                printk(KERN_ERR "swim3: fd dma: stat=%x resid=%d\n", stat, resid);
 741                                printk(KERN_ERR "  state=%d, dir=%x, intr=%x, err=%x\n",
 742                                       fs->state, rq_data_dir(fd_req), intr, err);
 743                                end_request(fd_req, 0);
 744                                fs->state = idle;
 745                                start_request(fs);
 746                                break;
 747                        }
 748                        fd_req->sector += fs->scount;
 749                        fd_req->current_nr_sectors -= fs->scount;
 750                        fd_req->buffer += fs->scount * 512;
 751                        if (fd_req->current_nr_sectors <= 0) {
 752                                end_request(fd_req, 1);
 753                                fs->state = idle;
 754                        } else {
 755                                fs->req_sector += fs->scount;
 756                                if (fs->req_sector > fs->secpertrack) {
 757                                        fs->req_sector -= fs->secpertrack;
 758                                        if (++fs->head > 1) {
 759                                                fs->head = 0;
 760                                                ++fs->req_cyl;
 761                                        }
 762                                }
 763                                act(fs);
 764                        }
 765                }
 766                if (fs->state == idle)
 767                        start_request(fs);
 768                break;
 769        default:
 770                printk(KERN_ERR "swim3: don't know what to do in state %d\n", fs->state);
 771        }
 772        return IRQ_HANDLED;
 773}
 774
 775/*
 776static void fd_dma_interrupt(int irq, void *dev_id)
 777{
 778}
 779*/
 780
 781static int grab_drive(struct floppy_state *fs, enum swim_state state,
 782                      int interruptible)
 783{
 784        unsigned long flags;
 785
 786        spin_lock_irqsave(&fs->lock, flags);
 787        if (fs->state != idle) {
 788                ++fs->wanted;
 789                while (fs->state != available) {
 790                        if (interruptible && signal_pending(current)) {
 791                                --fs->wanted;
 792                                spin_unlock_irqrestore(&fs->lock, flags);
 793                                return -EINTR;
 794                        }
 795                        interruptible_sleep_on(&fs->wait);
 796                }
 797                --fs->wanted;
 798        }
 799        fs->state = state;
 800        spin_unlock_irqrestore(&fs->lock, flags);
 801        return 0;
 802}
 803
 804static void release_drive(struct floppy_state *fs)
 805{
 806        unsigned long flags;
 807
 808        spin_lock_irqsave(&fs->lock, flags);
 809        fs->state = idle;
 810        start_request(fs);
 811        spin_unlock_irqrestore(&fs->lock, flags);
 812}
 813
 814static int fd_eject(struct floppy_state *fs)
 815{
 816        int err, n;
 817
 818        err = grab_drive(fs, ejecting, 1);
 819        if (err)
 820                return err;
 821        swim3_action(fs, EJECT);
 822        for (n = 20; n > 0; --n) {
 823                if (signal_pending(current)) {
 824                        err = -EINTR;
 825                        break;
 826                }
 827                swim3_select(fs, RELAX);
 828                schedule_timeout_interruptible(1);
 829                if (swim3_readbit(fs, DISK_IN) == 0)
 830                        break;
 831        }
 832        swim3_select(fs, RELAX);
 833        udelay(150);
 834        fs->ejected = 1;
 835        release_drive(fs);
 836        return err;
 837}
 838
 839static struct floppy_struct floppy_type =
 840        { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };    /*  7 1.44MB 3.5"   */
 841
 842static int floppy_ioctl(struct inode *inode, struct file *filp,
 843                        unsigned int cmd, unsigned long param)
 844{
 845        struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
 846        int err;
 847                
 848        if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
 849                return -EPERM;
 850
 851#ifdef CONFIG_PMAC_MEDIABAY
 852        if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
 853                return -ENXIO;
 854#endif
 855
 856        switch (cmd) {
 857        case FDEJECT:
 858                if (fs->ref_count != 1)
 859                        return -EBUSY;
 860                err = fd_eject(fs);
 861                return err;
 862        case FDGETPRM:
 863                if (copy_to_user((void __user *) param, &floppy_type,
 864                                 sizeof(struct floppy_struct)))
 865                        return -EFAULT;
 866                return 0;
 867        }
 868        return -ENOTTY;
 869}
 870
 871static int floppy_open(struct inode *inode, struct file *filp)
 872{
 873        struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
 874        struct swim3 __iomem *sw = fs->swim3;
 875        int n, err = 0;
 876
 877        if (fs->ref_count == 0) {
 878#ifdef CONFIG_PMAC_MEDIABAY
 879                if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
 880                        return -ENXIO;
 881#endif
 882                out_8(&sw->setup, S_IBM_DRIVE | S_FCLK_DIV2);
 883                out_8(&sw->control_bic, 0xff);
 884                out_8(&sw->mode, 0x95);
 885                udelay(10);
 886                out_8(&sw->intr_enable, 0);
 887                out_8(&sw->control_bis, DRIVE_ENABLE | INTR_ENABLE);
 888                swim3_action(fs, MOTOR_ON);
 889                fs->write_prot = -1;
 890                fs->cur_cyl = -1;
 891                for (n = 0; n < 2 * HZ; ++n) {
 892                        if (n >= HZ/30 && swim3_readbit(fs, SEEK_COMPLETE))
 893                                break;
 894                        if (signal_pending(current)) {
 895                                err = -EINTR;
 896                                break;
 897                        }
 898                        swim3_select(fs, RELAX);
 899                        schedule_timeout_interruptible(1);
 900                }
 901                if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0
 902                                 || swim3_readbit(fs, DISK_IN) == 0))
 903                        err = -ENXIO;
 904                swim3_action(fs, SETMFM);
 905                swim3_select(fs, RELAX);
 906
 907        } else if (fs->ref_count == -1 || filp->f_flags & O_EXCL)
 908                return -EBUSY;
 909
 910        if (err == 0 && (filp->f_flags & O_NDELAY) == 0
 911            && (filp->f_mode & 3)) {
 912                check_disk_change(inode->i_bdev);
 913                if (fs->ejected)
 914                        err = -ENXIO;
 915        }
 916
 917        if (err == 0 && (filp->f_mode & 2)) {
 918                if (fs->write_prot < 0)
 919                        fs->write_prot = swim3_readbit(fs, WRITE_PROT);
 920                if (fs->write_prot)
 921                        err = -EROFS;
 922        }
 923
 924        if (err) {
 925                if (fs->ref_count == 0) {
 926                        swim3_action(fs, MOTOR_OFF);
 927                        out_8(&sw->control_bic, DRIVE_ENABLE | INTR_ENABLE);
 928                        swim3_select(fs, RELAX);
 929                }
 930                return err;
 931        }
 932
 933        if (filp->f_flags & O_EXCL)
 934                fs->ref_count = -1;
 935        else
 936                ++fs->ref_count;
 937
 938        return 0;
 939}
 940
 941static int floppy_release(struct inode *inode, struct file *filp)
 942{
 943        struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
 944        struct swim3 __iomem *sw = fs->swim3;
 945        if (fs->ref_count > 0 && --fs->ref_count == 0) {
 946                swim3_action(fs, MOTOR_OFF);
 947                out_8(&sw->control_bic, 0xff);
 948                swim3_select(fs, RELAX);
 949        }
 950        return 0;
 951}
 952
 953static int floppy_check_change(struct gendisk *disk)
 954{
 955        struct floppy_state *fs = disk->private_data;
 956        return fs->ejected;
 957}
 958
 959static int floppy_revalidate(struct gendisk *disk)
 960{
 961        struct floppy_state *fs = disk->private_data;
 962        struct swim3 __iomem *sw;
 963        int ret, n;
 964
 965#ifdef CONFIG_PMAC_MEDIABAY
 966        if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD))
 967                return -ENXIO;
 968#endif
 969
 970        sw = fs->swim3;
 971        grab_drive(fs, revalidating, 0);
 972        out_8(&sw->intr_enable, 0);
 973        out_8(&sw->control_bis, DRIVE_ENABLE);
 974        swim3_action(fs, MOTOR_ON);     /* necessary? */
 975        fs->write_prot = -1;
 976        fs->cur_cyl = -1;
 977        mdelay(1);
 978        for (n = HZ; n > 0; --n) {
 979                if (swim3_readbit(fs, SEEK_COMPLETE))
 980                        break;
 981                if (signal_pending(current))
 982                        break;
 983                swim3_select(fs, RELAX);
 984                schedule_timeout_interruptible(1);
 985        }
 986        ret = swim3_readbit(fs, SEEK_COMPLETE) == 0
 987                || swim3_readbit(fs, DISK_IN) == 0;
 988        if (ret)
 989                swim3_action(fs, MOTOR_OFF);
 990        else {
 991                fs->ejected = 0;
 992                swim3_action(fs, SETMFM);
 993        }
 994        swim3_select(fs, RELAX);
 995
 996        release_drive(fs);
 997        return ret;
 998}
 999
1000static struct block_device_operations floppy_fops = {
1001        .open           = floppy_open,
1002        .release        = floppy_release,
1003        .ioctl          = floppy_ioctl,
1004        .media_changed  = floppy_check_change,
1005        .revalidate_disk= floppy_revalidate,
1006};
1007
1008static int swim3_add_device(struct macio_dev *mdev, int index)
1009{
1010        struct device_node *swim = mdev->ofdev.node;
1011        struct device_node *mediabay;
1012        struct floppy_state *fs = &floppy_states[index];
1013        int rc = -EBUSY;
1014
1015        /* Check & Request resources */
1016        if (macio_resource_count(mdev) < 2) {
1017                printk(KERN_WARNING "ifd%d: no address for %s\n",
1018                       index, swim->full_name);
1019                return -ENXIO;
1020        }
1021        if (macio_irq_count(mdev) < 2) {
1022                printk(KERN_WARNING "fd%d: no intrs for device %s\n",
1023                        index, swim->full_name);
1024        }
1025        if (macio_request_resource(mdev, 0, "swim3 (mmio)")) {
1026                printk(KERN_ERR "fd%d: can't request mmio resource for %s\n",
1027                       index, swim->full_name);
1028                return -EBUSY;
1029        }
1030        if (macio_request_resource(mdev, 1, "swim3 (dma)")) {
1031                printk(KERN_ERR "fd%d: can't request dma resource for %s\n",
1032                       index, swim->full_name);
1033                macio_release_resource(mdev, 0);
1034                return -EBUSY;
1035        }
1036        dev_set_drvdata(&mdev->ofdev.dev, fs);
1037
1038        mediabay = (strcasecmp(swim->parent->type, "media-bay") == 0) ?
1039                swim->parent : NULL;
1040        if (mediabay == NULL)
1041                pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1);
1042        
1043        memset(fs, 0, sizeof(*fs));
1044        spin_lock_init(&fs->lock);
1045        fs->state = idle;
1046        fs->swim3 = (struct swim3 __iomem *)
1047                ioremap(macio_resource_start(mdev, 0), 0x200);
1048        if (fs->swim3 == NULL) {
1049                printk("fd%d: couldn't map registers for %s\n",
1050                       index, swim->full_name);
1051                rc = -ENOMEM;
1052                goto out_release;
1053        }
1054        fs->dma = (struct dbdma_regs __iomem *)
1055                ioremap(macio_resource_start(mdev, 1), 0x200);
1056        if (fs->dma == NULL) {
1057                printk("fd%d: couldn't map DMA for %s\n",
1058                       index, swim->full_name);
1059                iounmap(fs->swim3);
1060                rc = -ENOMEM;
1061                goto out_release;
1062        }
1063        fs->swim3_intr = macio_irq(mdev, 0);
1064        fs->dma_intr = macio_irq(mdev, 1);;
1065        fs->cur_cyl = -1;
1066        fs->cur_sector = -1;
1067        fs->secpercyl = 36;
1068        fs->secpertrack = 18;
1069        fs->total_secs = 2880;
1070        fs->media_bay = mediabay;
1071        init_waitqueue_head(&fs->wait);
1072
1073        fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space);
1074        memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd));
1075        st_le16(&fs->dma_cmd[1].command, DBDMA_STOP);
1076
1077        if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) {
1078                printk(KERN_ERR "fd%d: couldn't request irq %d for %s\n",
1079                       index, fs->swim3_intr, swim->full_name);
1080                pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0);
1081                goto out_unmap;
1082                return -EBUSY;
1083        }
1084/*
1085        if (request_irq(fs->dma_intr, fd_dma_interrupt, 0, "SWIM3-dma", fs)) {
1086                printk(KERN_ERR "Couldn't get irq %d for SWIM3 DMA",
1087                       fs->dma_intr);
1088                return -EBUSY;
1089        }
1090*/
1091
1092        init_timer(&fs->timeout);
1093
1094        printk(KERN_INFO "fd%d: SWIM3 floppy controller %s\n", floppy_count,
1095                mediabay ? "in media bay" : "");
1096
1097        return 0;
1098
1099 out_unmap:
1100        iounmap(fs->dma);
1101        iounmap(fs->swim3);
1102
1103 out_release:
1104        macio_release_resource(mdev, 0);
1105        macio_release_resource(mdev, 1);
1106
1107        return rc;
1108}
1109
1110static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match)
1111{
1112        int i, rc;
1113        struct gendisk *disk;
1114
1115        /* Add the drive */
1116        rc = swim3_add_device(mdev, floppy_count);
1117        if (rc)
1118                return rc;
1119
1120        /* Now create the queue if not there yet */
1121        if (swim3_queue == NULL) {
1122                /* If we failed, there isn't much we can do as the driver is still
1123                 * too dumb to remove the device, just bail out
1124                 */
1125                if (register_blkdev(FLOPPY_MAJOR, "fd"))
1126                        return 0;
1127                swim3_queue = blk_init_queue(do_fd_request, &swim3_lock);
1128                if (swim3_queue == NULL) {
1129                        unregister_blkdev(FLOPPY_MAJOR, "fd");
1130                        return 0;
1131                }
1132        }
1133
1134        /* Now register that disk. Same comment about failure handling */
1135        i = floppy_count++;
1136        disk = disks[i] = alloc_disk(1);
1137        if (disk == NULL)
1138                return 0;
1139
1140        disk->major = FLOPPY_MAJOR;
1141        disk->first_minor = i;
1142        disk->fops = &floppy_fops;
1143        disk->private_data = &floppy_states[i];
1144        disk->queue = swim3_queue;
1145        disk->flags |= GENHD_FL_REMOVABLE;
1146        sprintf(disk->disk_name, "fd%d", i);
1147        set_capacity(disk, 2880);
1148        add_disk(disk);
1149
1150        return 0;
1151}
1152
1153static struct of_device_id swim3_match[] =
1154{
1155        {
1156        .name           = "swim3",
1157        },
1158        {
1159        .compatible     = "ohare-swim3"
1160        },
1161        {
1162        .compatible     = "swim3"
1163        },
1164};
1165
1166static struct macio_driver swim3_driver =
1167{
1168        .name           = "swim3",
1169        .match_table    = swim3_match,
1170        .probe          = swim3_attach,
1171#if 0
1172        .suspend        = swim3_suspend,
1173        .resume         = swim3_resume,
1174#endif
1175};
1176
1177
1178int swim3_init(void)
1179{
1180        macio_register_driver(&swim3_driver);
1181        return 0;
1182}
1183
1184module_init(swim3_init)
1185
1186MODULE_LICENSE("GPL");
1187MODULE_AUTHOR("Paul Mackerras");
1188MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);
1189