swim3.c (e4da3fbfbd1de56d2367653e3823e6445e49f8a9) | swim3.c (b302545744c031eae04a43fb1c56cc17e00a193a) |
---|---|
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 | 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#undef DEBUG 20 |
|
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> --- 4 unchanged lines hidden (view full) --- 31#include <asm/io.h> 32#include <asm/dbdma.h> 33#include <asm/prom.h> 34#include <asm/uaccess.h> 35#include <asm/mediabay.h> 36#include <asm/machdep.h> 37#include <asm/pmac_feature.h> 38 | 21#include <linux/stddef.h> 22#include <linux/kernel.h> 23#include <linux/sched.h> 24#include <linux/timer.h> 25#include <linux/delay.h> 26#include <linux/fd.h> 27#include <linux/ioctl.h> 28#include <linux/blkdev.h> --- 4 unchanged lines hidden (view full) --- 33#include <asm/io.h> 34#include <asm/dbdma.h> 35#include <asm/prom.h> 36#include <asm/uaccess.h> 37#include <asm/mediabay.h> 38#include <asm/machdep.h> 39#include <asm/pmac_feature.h> 40 |
39static DEFINE_MUTEX(swim3_mutex); 40static struct request_queue *swim3_queue; 41static struct gendisk *disks[2]; 42static struct request *fd_req; 43 | |
44#define MAX_FLOPPIES 2 45 | 41#define MAX_FLOPPIES 2 42 |
43static DEFINE_MUTEX(swim3_mutex); 44static struct gendisk *disks[MAX_FLOPPIES]; 45 |
|
46enum swim_state { 47 idle, 48 locating, 49 seeking, 50 settling, 51 do_transfer, 52 jogging, 53 available, --- 118 unchanged lines hidden (view full) --- 172 173#define DATA_99 "\x99\x99" 174#define MFM_ADDR_MARK "\x99\xa1\x99\xa1\x99\xa1\x99\xfe" 175#define MFM_INDEX_MARK "\x99\xc2\x99\xc2\x99\xc2\x99\xfc" 176#define MFM_GAP_LEN 12 177 178struct floppy_state { 179 enum swim_state state; | 46enum swim_state { 47 idle, 48 locating, 49 seeking, 50 settling, 51 do_transfer, 52 jogging, 53 available, --- 118 unchanged lines hidden (view full) --- 172 173#define DATA_99 "\x99\x99" 174#define MFM_ADDR_MARK "\x99\xa1\x99\xa1\x99\xa1\x99\xfe" 175#define MFM_INDEX_MARK "\x99\xc2\x99\xc2\x99\xc2\x99\xfc" 176#define MFM_GAP_LEN 12 177 178struct floppy_state { 179 enum swim_state state; |
180 spinlock_t lock; | |
181 struct swim3 __iomem *swim3; /* hardware registers */ 182 struct dbdma_regs __iomem *dma; /* DMA controller registers */ 183 int swim3_intr; /* interrupt number for SWIM3 */ 184 int dma_intr; /* interrupt number for DMA channel */ 185 int cur_cyl; /* cylinder head is on, or -1 */ 186 int cur_sector; /* last sector we saw go past */ 187 int req_cyl; /* the cylinder for the current r/w request */ 188 int head; /* head number ditto */ --- 10 unchanged lines hidden (view full) --- 199 int expect_cyl; 200 struct timer_list timeout; 201 int timeout_pending; 202 int ejected; 203 wait_queue_head_t wait; 204 int wanted; 205 struct macio_dev *mdev; 206 char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)]; | 180 struct swim3 __iomem *swim3; /* hardware registers */ 181 struct dbdma_regs __iomem *dma; /* DMA controller registers */ 182 int swim3_intr; /* interrupt number for SWIM3 */ 183 int dma_intr; /* interrupt number for DMA channel */ 184 int cur_cyl; /* cylinder head is on, or -1 */ 185 int cur_sector; /* last sector we saw go past */ 186 int req_cyl; /* the cylinder for the current r/w request */ 187 int head; /* head number ditto */ --- 10 unchanged lines hidden (view full) --- 198 int expect_cyl; 199 struct timer_list timeout; 200 int timeout_pending; 201 int ejected; 202 wait_queue_head_t wait; 203 int wanted; 204 struct macio_dev *mdev; 205 char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)]; |
206 int index; 207 struct request *cur_req; |
|
207}; 208 | 208}; 209 |
210#define swim3_err(fmt, arg...) dev_err(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) 211#define swim3_warn(fmt, arg...) dev_warn(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) 212#define swim3_info(fmt, arg...) dev_info(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) 213 214#ifdef DEBUG 215#define swim3_dbg(fmt, arg...) dev_dbg(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) 216#else 217#define swim3_dbg(fmt, arg...) do { } while(0) 218#endif 219 |
|
209static struct floppy_state floppy_states[MAX_FLOPPIES]; 210static int floppy_count = 0; 211static DEFINE_SPINLOCK(swim3_lock); 212 213static unsigned short write_preamble[] = { 214 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, /* gap field */ 215 0, 0, 0, 0, 0, 0, /* sync field */ 216 0x99a1, 0x99a1, 0x99a1, 0x99fb, /* data address mark */ 217 0x990f /* no escape for 512 bytes */ 218}; 219 220static unsigned short write_postamble[] = { 221 0x9904, /* insert CRC */ 222 0x4e4e, 0x4e4e, 223 0x9908, /* stop writing */ 224 0, 0, 0, 0, 0, 0 225}; 226 | 220static struct floppy_state floppy_states[MAX_FLOPPIES]; 221static int floppy_count = 0; 222static DEFINE_SPINLOCK(swim3_lock); 223 224static unsigned short write_preamble[] = { 225 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, /* gap field */ 226 0, 0, 0, 0, 0, 0, /* sync field */ 227 0x99a1, 0x99a1, 0x99a1, 0x99fb, /* data address mark */ 228 0x990f /* no escape for 512 bytes */ 229}; 230 231static unsigned short write_postamble[] = { 232 0x9904, /* insert CRC */ 233 0x4e4e, 0x4e4e, 234 0x9908, /* stop writing */ 235 0, 0, 0, 0, 0, 0 236}; 237 |
227static void swim3_select(struct floppy_state *fs, int sel); 228static void swim3_action(struct floppy_state *fs, int action); 229static int swim3_readbit(struct floppy_state *fs, int bit); 230static void do_fd_request(struct request_queue * q); 231static void start_request(struct floppy_state *fs); 232static void set_timeout(struct floppy_state *fs, int nticks, 233 void (*proc)(unsigned long)); 234static void scan_track(struct floppy_state *fs); | |
235static void seek_track(struct floppy_state *fs, int n); 236static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count); | 238static void seek_track(struct floppy_state *fs, int n); 239static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count); |
237static void setup_transfer(struct floppy_state *fs); | |
238static void act(struct floppy_state *fs); 239static void scan_timeout(unsigned long data); 240static void seek_timeout(unsigned long data); 241static void settle_timeout(unsigned long data); 242static void xfer_timeout(unsigned long data); 243static irqreturn_t swim3_interrupt(int irq, void *dev_id); 244/*static void fd_dma_interrupt(int irq, void *dev_id);*/ 245static int grab_drive(struct floppy_state *fs, enum swim_state state, 246 int interruptible); 247static void release_drive(struct floppy_state *fs); 248static int fd_eject(struct floppy_state *fs); 249static int floppy_ioctl(struct block_device *bdev, fmode_t mode, 250 unsigned int cmd, unsigned long param); 251static int floppy_open(struct block_device *bdev, fmode_t mode); 252static int floppy_release(struct gendisk *disk, fmode_t mode); 253static unsigned int floppy_check_events(struct gendisk *disk, 254 unsigned int clearing); 255static int floppy_revalidate(struct gendisk *disk); 256 | 240static void act(struct floppy_state *fs); 241static void scan_timeout(unsigned long data); 242static void seek_timeout(unsigned long data); 243static void settle_timeout(unsigned long data); 244static void xfer_timeout(unsigned long data); 245static irqreturn_t swim3_interrupt(int irq, void *dev_id); 246/*static void fd_dma_interrupt(int irq, void *dev_id);*/ 247static int grab_drive(struct floppy_state *fs, enum swim_state state, 248 int interruptible); 249static void release_drive(struct floppy_state *fs); 250static int fd_eject(struct floppy_state *fs); 251static int floppy_ioctl(struct block_device *bdev, fmode_t mode, 252 unsigned int cmd, unsigned long param); 253static int floppy_open(struct block_device *bdev, fmode_t mode); 254static int floppy_release(struct gendisk *disk, fmode_t mode); 255static unsigned int floppy_check_events(struct gendisk *disk, 256 unsigned int clearing); 257static int floppy_revalidate(struct gendisk *disk); 258 |
257static bool swim3_end_request(int err, unsigned int nr_bytes) | 259static bool swim3_end_request(struct floppy_state *fs, int err, unsigned int nr_bytes) |
258{ | 260{ |
259 if (__blk_end_request(fd_req, err, nr_bytes)) 260 return true; | 261 struct request *req = fs->cur_req; 262 int rc; |
261 | 263 |
262 fd_req = NULL; | 264 swim3_dbg(" end request, err=%d nr_bytes=%d, cur_req=%p\n", 265 err, nr_bytes, req); 266 267 if (err) 268 nr_bytes = blk_rq_cur_bytes(req); 269 rc = __blk_end_request(req, err, nr_bytes); 270 if (rc) 271 return true; 272 fs->cur_req = NULL; |
263 return false; 264} 265 | 273 return false; 274} 275 |
266static bool swim3_end_request_cur(int err) 267{ 268 return swim3_end_request(err, blk_rq_cur_bytes(fd_req)); 269} 270 | |
271static void swim3_select(struct floppy_state *fs, int sel) 272{ 273 struct swim3 __iomem *sw = fs->swim3; 274 275 out_8(&sw->select, RELAX); 276 if (sel & 8) 277 out_8(&sw->control_bis, SELECT); 278 else --- 19 unchanged lines hidden (view full) --- 298 int stat; 299 300 swim3_select(fs, bit); 301 udelay(1); 302 stat = in_8(&sw->status); 303 return (stat & DATA) == 0; 304} 305 | 276static void swim3_select(struct floppy_state *fs, int sel) 277{ 278 struct swim3 __iomem *sw = fs->swim3; 279 280 out_8(&sw->select, RELAX); 281 if (sel & 8) 282 out_8(&sw->control_bis, SELECT); 283 else --- 19 unchanged lines hidden (view full) --- 303 int stat; 304 305 swim3_select(fs, bit); 306 udelay(1); 307 stat = in_8(&sw->status); 308 return (stat & DATA) == 0; 309} 310 |
306static void do_fd_request(struct request_queue * q) 307{ 308 int i; 309 310 for(i=0; i<floppy_count; i++) { 311 struct floppy_state *fs = &floppy_states[i]; 312 if (fs->mdev->media_bay && 313 check_media_bay(fs->mdev->media_bay) != MB_FD) 314 continue; 315 start_request(fs); 316 } 317} 318 | |
319static void start_request(struct floppy_state *fs) 320{ 321 struct request *req; 322 unsigned long x; 323 | 311static void start_request(struct floppy_state *fs) 312{ 313 struct request *req; 314 unsigned long x; 315 |
316 swim3_dbg("start request, initial state=%d\n", fs->state); 317 |
|
324 if (fs->state == idle && fs->wanted) { 325 fs->state = available; 326 wake_up(&fs->wait); 327 return; 328 } 329 while (fs->state == idle) { | 318 if (fs->state == idle && fs->wanted) { 319 fs->state = available; 320 wake_up(&fs->wait); 321 return; 322 } 323 while (fs->state == idle) { |
330 if (!fd_req) { 331 fd_req = blk_fetch_request(swim3_queue); 332 if (!fd_req) | 324 swim3_dbg("start request, idle loop, cur_req=%p\n", fs->cur_req); 325 if (!fs->cur_req) { 326 fs->cur_req = blk_fetch_request(disks[fs->index]->queue); 327 swim3_dbg(" fetched request %p\n", fs->cur_req); 328 if (!fs->cur_req) |
333 break; 334 } | 329 break; 330 } |
335 req = fd_req; 336#if 0 337 printk("do_fd_req: dev=%s cmd=%d sec=%ld nr_sec=%u buf=%p\n", 338 req->rq_disk->disk_name, req->cmd, 339 (long)blk_rq_pos(req), blk_rq_sectors(req), req->buffer); 340 printk(" errors=%d current_nr_sectors=%u\n", 341 req->errors, blk_rq_cur_sectors(req)); | 331 req = fs->cur_req; 332 333 if (fs->mdev->media_bay && 334 check_media_bay(fs->mdev->media_bay) != MB_FD) { 335 swim3_dbg("%s", " media bay absent, dropping req\n"); 336 swim3_end_request(fs, -ENODEV, 0); 337 continue; 338 } 339 340#if 0 /* This is really too verbose */ 341 swim3_dbg("do_fd_req: dev=%s cmd=%d sec=%ld nr_sec=%u buf=%p\n", 342 req->rq_disk->disk_name, req->cmd, 343 (long)blk_rq_pos(req), blk_rq_sectors(req), 344 req->buffer); 345 swim3_dbg(" errors=%d current_nr_sectors=%u\n", 346 req->errors, blk_rq_cur_sectors(req)); |
342#endif 343 344 if (blk_rq_pos(req) >= fs->total_secs) { | 347#endif 348 349 if (blk_rq_pos(req) >= fs->total_secs) { |
345 swim3_end_request_cur(-EIO); | 350 swim3_dbg(" pos out of bounds (%ld, max is %ld)\n", 351 (long)blk_rq_pos(req), (long)fs->total_secs); 352 swim3_end_request(fs, -EIO, 0); |
346 continue; 347 } 348 if (fs->ejected) { | 353 continue; 354 } 355 if (fs->ejected) { |
349 swim3_end_request_cur(-EIO); | 356 swim3_dbg("%s", " disk ejected\n"); 357 swim3_end_request(fs, -EIO, 0); |
350 continue; 351 } 352 353 if (rq_data_dir(req) == WRITE) { 354 if (fs->write_prot < 0) 355 fs->write_prot = swim3_readbit(fs, WRITE_PROT); 356 if (fs->write_prot) { | 358 continue; 359 } 360 361 if (rq_data_dir(req) == WRITE) { 362 if (fs->write_prot < 0) 363 fs->write_prot = swim3_readbit(fs, WRITE_PROT); 364 if (fs->write_prot) { |
357 swim3_end_request_cur(-EIO); | 365 swim3_dbg("%s", " try to write, disk write protected\n"); 366 swim3_end_request(fs, -EIO, 0); |
358 continue; 359 } 360 } 361 362 /* Do not remove the cast. blk_rq_pos(req) is now a 363 * sector_t and can be 64 bits, but it will never go 364 * past 32 bits for this driver anyway, so we can 365 * safely cast it down and not have to do a 64/32 366 * division 367 */ 368 fs->req_cyl = ((long)blk_rq_pos(req)) / fs->secpercyl; 369 x = ((long)blk_rq_pos(req)) % fs->secpercyl; 370 fs->head = x / fs->secpertrack; 371 fs->req_sector = x % fs->secpertrack + 1; | 367 continue; 368 } 369 } 370 371 /* Do not remove the cast. blk_rq_pos(req) is now a 372 * sector_t and can be 64 bits, but it will never go 373 * past 32 bits for this driver anyway, so we can 374 * safely cast it down and not have to do a 64/32 375 * division 376 */ 377 fs->req_cyl = ((long)blk_rq_pos(req)) / fs->secpercyl; 378 x = ((long)blk_rq_pos(req)) % fs->secpercyl; 379 fs->head = x / fs->secpertrack; 380 fs->req_sector = x % fs->secpertrack + 1; |
372 fd_req = req; | |
373 fs->state = do_transfer; 374 fs->retries = 0; 375 376 act(fs); 377 } 378} 379 | 381 fs->state = do_transfer; 382 fs->retries = 0; 383 384 act(fs); 385 } 386} 387 |
388static void do_fd_request(struct request_queue * q) 389{ 390 start_request(q->queuedata); 391} 392 |
|
380static void set_timeout(struct floppy_state *fs, int nticks, 381 void (*proc)(unsigned long)) 382{ | 393static void set_timeout(struct floppy_state *fs, int nticks, 394 void (*proc)(unsigned long)) 395{ |
383 unsigned long flags; 384 385 spin_lock_irqsave(&fs->lock, flags); | |
386 if (fs->timeout_pending) 387 del_timer(&fs->timeout); 388 fs->timeout.expires = jiffies + nticks; 389 fs->timeout.function = proc; 390 fs->timeout.data = (unsigned long) fs; 391 add_timer(&fs->timeout); 392 fs->timeout_pending = 1; | 396 if (fs->timeout_pending) 397 del_timer(&fs->timeout); 398 fs->timeout.expires = jiffies + nticks; 399 fs->timeout.function = proc; 400 fs->timeout.data = (unsigned long) fs; 401 add_timer(&fs->timeout); 402 fs->timeout_pending = 1; |
393 spin_unlock_irqrestore(&fs->lock, flags); | |
394} 395 396static inline void scan_track(struct floppy_state *fs) 397{ 398 struct swim3 __iomem *sw = fs->swim3; 399 400 swim3_select(fs, READ_DATA_0); 401 in_8(&sw->intr); /* clear SEEN_SECTOR bit */ --- 35 unchanged lines hidden (view full) --- 437} 438 439static inline void setup_transfer(struct floppy_state *fs) 440{ 441 int n; 442 struct swim3 __iomem *sw = fs->swim3; 443 struct dbdma_cmd *cp = fs->dma_cmd; 444 struct dbdma_regs __iomem *dr = fs->dma; | 403} 404 405static inline void scan_track(struct floppy_state *fs) 406{ 407 struct swim3 __iomem *sw = fs->swim3; 408 409 swim3_select(fs, READ_DATA_0); 410 in_8(&sw->intr); /* clear SEEN_SECTOR bit */ --- 35 unchanged lines hidden (view full) --- 446} 447 448static inline void setup_transfer(struct floppy_state *fs) 449{ 450 int n; 451 struct swim3 __iomem *sw = fs->swim3; 452 struct dbdma_cmd *cp = fs->dma_cmd; 453 struct dbdma_regs __iomem *dr = fs->dma; |
454 struct request *req = fs->cur_req; |
|
445 | 455 |
446 if (blk_rq_cur_sectors(fd_req) <= 0) { 447 printk(KERN_ERR "swim3: transfer 0 sectors?\n"); | 456 if (blk_rq_cur_sectors(req) <= 0) { 457 swim3_warn("%s", "Transfer 0 sectors ?\n"); |
448 return; 449 } | 458 return; 459 } |
450 if (rq_data_dir(fd_req) == WRITE) | 460 if (rq_data_dir(req) == WRITE) |
451 n = 1; 452 else { 453 n = fs->secpertrack - fs->req_sector + 1; | 461 n = 1; 462 else { 463 n = fs->secpertrack - fs->req_sector + 1; |
454 if (n > blk_rq_cur_sectors(fd_req)) 455 n = blk_rq_cur_sectors(fd_req); | 464 if (n > blk_rq_cur_sectors(req)) 465 n = blk_rq_cur_sectors(req); |
456 } | 466 } |
467 468 swim3_dbg(" setup xfer at sect %d (of %d) head %d for %d\n", 469 fs->req_sector, fs->secpertrack, fs->head, n); 470 |
|
457 fs->scount = n; 458 swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0); 459 out_8(&sw->sector, fs->req_sector); 460 out_8(&sw->nsect, n); 461 out_8(&sw->gap3, 0); 462 out_le32(&dr->cmdptr, virt_to_bus(cp)); | 471 fs->scount = n; 472 swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0); 473 out_8(&sw->sector, fs->req_sector); 474 out_8(&sw->nsect, n); 475 out_8(&sw->gap3, 0); 476 out_le32(&dr->cmdptr, virt_to_bus(cp)); |
463 if (rq_data_dir(fd_req) == WRITE) { | 477 if (rq_data_dir(req) == WRITE) { |
464 /* Set up 3 dma commands: write preamble, data, postamble */ 465 init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble)); 466 ++cp; | 478 /* Set up 3 dma commands: write preamble, data, postamble */ 479 init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble)); 480 ++cp; |
467 init_dma(cp, OUTPUT_MORE, fd_req->buffer, 512); | 481 init_dma(cp, OUTPUT_MORE, req->buffer, 512); |
468 ++cp; 469 init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble)); 470 } else { | 482 ++cp; 483 init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble)); 484 } else { |
471 init_dma(cp, INPUT_LAST, fd_req->buffer, n * 512); | 485 init_dma(cp, INPUT_LAST, req->buffer, n * 512); |
472 } 473 ++cp; 474 out_le16(&cp->command, DBDMA_STOP); 475 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 476 in_8(&sw->error); 477 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); | 486 } 487 ++cp; 488 out_le16(&cp->command, DBDMA_STOP); 489 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 490 in_8(&sw->error); 491 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); |
478 if (rq_data_dir(fd_req) == WRITE) | 492 if (rq_data_dir(req) == WRITE) |
479 out_8(&sw->control_bis, WRITE_SECTORS); 480 in_8(&sw->intr); 481 out_le32(&dr->control, (RUN << 16) | RUN); 482 /* enable intr when transfer complete */ 483 out_8(&sw->intr_enable, TRANSFER_DONE); 484 out_8(&sw->control_bis, DO_ACTION); 485 set_timeout(fs, 2*HZ, xfer_timeout); /* enable timeout */ 486} 487 488static void act(struct floppy_state *fs) 489{ 490 for (;;) { | 493 out_8(&sw->control_bis, WRITE_SECTORS); 494 in_8(&sw->intr); 495 out_le32(&dr->control, (RUN << 16) | RUN); 496 /* enable intr when transfer complete */ 497 out_8(&sw->intr_enable, TRANSFER_DONE); 498 out_8(&sw->control_bis, DO_ACTION); 499 set_timeout(fs, 2*HZ, xfer_timeout); /* enable timeout */ 500} 501 502static void act(struct floppy_state *fs) 503{ 504 for (;;) { |
505 swim3_dbg(" act loop, state=%d, req_cyl=%d, cur_cyl=%d\n", 506 fs->state, fs->req_cyl, fs->cur_cyl); 507 |
|
491 switch (fs->state) { 492 case idle: 493 return; /* XXX shouldn't get here */ 494 495 case locating: 496 if (swim3_readbit(fs, TRACK_ZERO)) { | 508 switch (fs->state) { 509 case idle: 510 return; /* XXX shouldn't get here */ 511 512 case locating: 513 if (swim3_readbit(fs, TRACK_ZERO)) { |
514 swim3_dbg("%s", " locate track 0\n"); |
|
497 fs->cur_cyl = 0; 498 if (fs->req_cyl == 0) 499 fs->state = do_transfer; 500 else 501 fs->state = seeking; 502 break; 503 } 504 scan_track(fs); 505 return; 506 507 case seeking: 508 if (fs->cur_cyl < 0) { 509 fs->expect_cyl = -1; 510 fs->state = locating; 511 break; 512 } 513 if (fs->req_cyl == fs->cur_cyl) { | 515 fs->cur_cyl = 0; 516 if (fs->req_cyl == 0) 517 fs->state = do_transfer; 518 else 519 fs->state = seeking; 520 break; 521 } 522 scan_track(fs); 523 return; 524 525 case seeking: 526 if (fs->cur_cyl < 0) { 527 fs->expect_cyl = -1; 528 fs->state = locating; 529 break; 530 } 531 if (fs->req_cyl == fs->cur_cyl) { |
514 printk("whoops, seeking 0\n"); | 532 swim3_warn("%s", "Whoops, seeking 0\n"); |
515 fs->state = do_transfer; 516 break; 517 } 518 seek_track(fs, fs->req_cyl - fs->cur_cyl); 519 return; 520 521 case settling: 522 /* check for SEEK_COMPLETE after 30ms */ 523 fs->settle_time = (HZ + 32) / 33; 524 set_timeout(fs, fs->settle_time, settle_timeout); 525 return; 526 527 case do_transfer: 528 if (fs->cur_cyl != fs->req_cyl) { 529 if (fs->retries > 5) { | 533 fs->state = do_transfer; 534 break; 535 } 536 seek_track(fs, fs->req_cyl - fs->cur_cyl); 537 return; 538 539 case settling: 540 /* check for SEEK_COMPLETE after 30ms */ 541 fs->settle_time = (HZ + 32) / 33; 542 set_timeout(fs, fs->settle_time, settle_timeout); 543 return; 544 545 case do_transfer: 546 if (fs->cur_cyl != fs->req_cyl) { 547 if (fs->retries > 5) { |
530 swim3_end_request_cur(-EIO); | 548 swim3_err("Wrong cylinder in transfer, want: %d got %d\n", 549 fs->req_cyl, fs->cur_cyl); 550 swim3_end_request(fs, -EIO, 0); |
531 fs->state = idle; 532 return; 533 } 534 fs->state = seeking; 535 break; 536 } 537 setup_transfer(fs); 538 return; 539 540 case jogging: 541 seek_track(fs, -5); 542 return; 543 544 default: | 551 fs->state = idle; 552 return; 553 } 554 fs->state = seeking; 555 break; 556 } 557 setup_transfer(fs); 558 return; 559 560 case jogging: 561 seek_track(fs, -5); 562 return; 563 564 default: |
545 printk(KERN_ERR"swim3: unknown state %d\n", fs->state); | 565 swim3_err("Unknown state %d\n", fs->state); |
546 return; 547 } 548 } 549} 550 551static void scan_timeout(unsigned long data) 552{ 553 struct floppy_state *fs = (struct floppy_state *) data; 554 struct swim3 __iomem *sw = fs->swim3; | 566 return; 567 } 568 } 569} 570 571static void scan_timeout(unsigned long data) 572{ 573 struct floppy_state *fs = (struct floppy_state *) data; 574 struct swim3 __iomem *sw = fs->swim3; |
575 unsigned long flags; |
|
555 | 576 |
577 swim3_dbg("* scan timeout, state=%d\n", fs->state); 578 579 spin_lock_irqsave(&swim3_lock, flags); |
|
556 fs->timeout_pending = 0; 557 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 558 out_8(&sw->select, RELAX); 559 out_8(&sw->intr_enable, 0); 560 fs->cur_cyl = -1; 561 if (fs->retries > 5) { | 580 fs->timeout_pending = 0; 581 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 582 out_8(&sw->select, RELAX); 583 out_8(&sw->intr_enable, 0); 584 fs->cur_cyl = -1; 585 if (fs->retries > 5) { |
562 swim3_end_request_cur(-EIO); | 586 swim3_end_request(fs, -EIO, 0); |
563 fs->state = idle; 564 start_request(fs); 565 } else { 566 fs->state = jogging; 567 act(fs); 568 } | 587 fs->state = idle; 588 start_request(fs); 589 } else { 590 fs->state = jogging; 591 act(fs); 592 } |
593 spin_unlock_irqrestore(&swim3_lock, flags); |
|
569} 570 571static void seek_timeout(unsigned long data) 572{ 573 struct floppy_state *fs = (struct floppy_state *) data; 574 struct swim3 __iomem *sw = fs->swim3; | 594} 595 596static void seek_timeout(unsigned long data) 597{ 598 struct floppy_state *fs = (struct floppy_state *) data; 599 struct swim3 __iomem *sw = fs->swim3; |
600 unsigned long flags; |
|
575 | 601 |
602 swim3_dbg("* seek timeout, state=%d\n", fs->state); 603 604 spin_lock_irqsave(&swim3_lock, flags); |
|
576 fs->timeout_pending = 0; 577 out_8(&sw->control_bic, DO_SEEK); 578 out_8(&sw->select, RELAX); 579 out_8(&sw->intr_enable, 0); | 605 fs->timeout_pending = 0; 606 out_8(&sw->control_bic, DO_SEEK); 607 out_8(&sw->select, RELAX); 608 out_8(&sw->intr_enable, 0); |
580 printk(KERN_ERR "swim3: seek timeout\n"); 581 swim3_end_request_cur(-EIO); | 609 swim3_err("%s", "Seek timeout\n"); 610 swim3_end_request(fs, -EIO, 0); |
582 fs->state = idle; 583 start_request(fs); | 611 fs->state = idle; 612 start_request(fs); |
613 spin_unlock_irqrestore(&swim3_lock, flags); |
|
584} 585 586static void settle_timeout(unsigned long data) 587{ 588 struct floppy_state *fs = (struct floppy_state *) data; 589 struct swim3 __iomem *sw = fs->swim3; | 614} 615 616static void settle_timeout(unsigned long data) 617{ 618 struct floppy_state *fs = (struct floppy_state *) data; 619 struct swim3 __iomem *sw = fs->swim3; |
620 unsigned long flags; |
|
590 | 621 |
622 swim3_dbg("* settle timeout, state=%d\n", fs->state); 623 624 spin_lock_irqsave(&swim3_lock, flags); |
|
591 fs->timeout_pending = 0; 592 if (swim3_readbit(fs, SEEK_COMPLETE)) { 593 out_8(&sw->select, RELAX); 594 fs->state = locating; 595 act(fs); | 625 fs->timeout_pending = 0; 626 if (swim3_readbit(fs, SEEK_COMPLETE)) { 627 out_8(&sw->select, RELAX); 628 fs->state = locating; 629 act(fs); |
596 return; | 630 goto unlock; |
597 } 598 out_8(&sw->select, RELAX); 599 if (fs->settle_time < 2*HZ) { 600 ++fs->settle_time; 601 set_timeout(fs, 1, settle_timeout); | 631 } 632 out_8(&sw->select, RELAX); 633 if (fs->settle_time < 2*HZ) { 634 ++fs->settle_time; 635 set_timeout(fs, 1, settle_timeout); |
602 return; | 636 goto unlock; |
603 } | 637 } |
604 printk(KERN_ERR "swim3: seek settle timeout\n"); 605 swim3_end_request_cur(-EIO); | 638 swim3_err("%s", "Seek settle timeout\n"); 639 swim3_end_request(fs, -EIO, 0); |
606 fs->state = idle; 607 start_request(fs); | 640 fs->state = idle; 641 start_request(fs); |
642 unlock: 643 spin_unlock_irqrestore(&swim3_lock, flags); |
|
608} 609 610static void xfer_timeout(unsigned long data) 611{ 612 struct floppy_state *fs = (struct floppy_state *) data; 613 struct swim3 __iomem *sw = fs->swim3; 614 struct dbdma_regs __iomem *dr = fs->dma; | 644} 645 646static void xfer_timeout(unsigned long data) 647{ 648 struct floppy_state *fs = (struct floppy_state *) data; 649 struct swim3 __iomem *sw = fs->swim3; 650 struct dbdma_regs __iomem *dr = fs->dma; |
651 unsigned long flags; |
|
615 int n; 616 | 652 int n; 653 |
654 swim3_dbg("* xfer timeout, state=%d\n", fs->state); 655 656 spin_lock_irqsave(&swim3_lock, flags); |
|
617 fs->timeout_pending = 0; 618 out_le32(&dr->control, RUN << 16); 619 /* We must wait a bit for dbdma to stop */ 620 for (n = 0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++) 621 udelay(1); 622 out_8(&sw->intr_enable, 0); 623 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); 624 out_8(&sw->select, RELAX); | 657 fs->timeout_pending = 0; 658 out_le32(&dr->control, RUN << 16); 659 /* We must wait a bit for dbdma to stop */ 660 for (n = 0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++) 661 udelay(1); 662 out_8(&sw->intr_enable, 0); 663 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); 664 out_8(&sw->select, RELAX); |
625 printk(KERN_ERR "swim3: timeout %sing sector %ld\n", 626 (rq_data_dir(fd_req)==WRITE? "writ": "read"), 627 (long)blk_rq_pos(fd_req)); 628 swim3_end_request_cur(-EIO); | 665 swim3_err("Timeout %sing sector %ld\n", 666 (rq_data_dir(fs->cur_req)==WRITE? "writ": "read"), 667 (long)blk_rq_pos(fs->cur_req)); 668 swim3_end_request(fs, -EIO, 0); |
629 fs->state = idle; 630 start_request(fs); | 669 fs->state = idle; 670 start_request(fs); |
671 spin_unlock_irqrestore(&swim3_lock, flags); |
|
631} 632 633static irqreturn_t swim3_interrupt(int irq, void *dev_id) 634{ 635 struct floppy_state *fs = (struct floppy_state *) dev_id; 636 struct swim3 __iomem *sw = fs->swim3; 637 int intr, err, n; 638 int stat, resid; 639 struct dbdma_regs __iomem *dr; 640 struct dbdma_cmd *cp; | 672} 673 674static irqreturn_t swim3_interrupt(int irq, void *dev_id) 675{ 676 struct floppy_state *fs = (struct floppy_state *) dev_id; 677 struct swim3 __iomem *sw = fs->swim3; 678 int intr, err, n; 679 int stat, resid; 680 struct dbdma_regs __iomem *dr; 681 struct dbdma_cmd *cp; |
682 unsigned long flags; 683 struct request *req = fs->cur_req; |
|
641 | 684 |
685 swim3_dbg("* interrupt, state=%d\n", fs->state); 686 687 spin_lock_irqsave(&swim3_lock, flags); |
|
642 intr = in_8(&sw->intr); 643 err = (intr & ERROR_INTR)? in_8(&sw->error): 0; 644 if ((intr & ERROR_INTR) && fs->state != do_transfer) | 688 intr = in_8(&sw->intr); 689 err = (intr & ERROR_INTR)? in_8(&sw->error): 0; 690 if ((intr & ERROR_INTR) && fs->state != do_transfer) |
645 printk(KERN_ERR "swim3_interrupt, state=%d, dir=%x, intr=%x, err=%x\n", 646 fs->state, rq_data_dir(fd_req), intr, err); | 691 swim3_err("Non-transfer error interrupt: state=%d, dir=%x, intr=%x, err=%x\n", 692 fs->state, rq_data_dir(req), intr, err); |
647 switch (fs->state) { 648 case locating: 649 if (intr & SEEN_SECTOR) { 650 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 651 out_8(&sw->select, RELAX); 652 out_8(&sw->intr_enable, 0); 653 del_timer(&fs->timeout); 654 fs->timeout_pending = 0; 655 if (sw->ctrack == 0xff) { | 693 switch (fs->state) { 694 case locating: 695 if (intr & SEEN_SECTOR) { 696 out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); 697 out_8(&sw->select, RELAX); 698 out_8(&sw->intr_enable, 0); 699 del_timer(&fs->timeout); 700 fs->timeout_pending = 0; 701 if (sw->ctrack == 0xff) { |
656 printk(KERN_ERR "swim3: seen sector but cyl=ff?\n"); | 702 swim3_err("%s", "Seen sector but cyl=ff?\n"); |
657 fs->cur_cyl = -1; 658 if (fs->retries > 5) { | 703 fs->cur_cyl = -1; 704 if (fs->retries > 5) { |
659 swim3_end_request_cur(-EIO); | 705 swim3_end_request(fs, -EIO, 0); |
660 fs->state = idle; 661 start_request(fs); 662 } else { 663 fs->state = jogging; 664 act(fs); 665 } 666 break; 667 } 668 fs->cur_cyl = sw->ctrack; 669 fs->cur_sector = sw->csect; 670 if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl) | 706 fs->state = idle; 707 start_request(fs); 708 } else { 709 fs->state = jogging; 710 act(fs); 711 } 712 break; 713 } 714 fs->cur_cyl = sw->ctrack; 715 fs->cur_sector = sw->csect; 716 if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl) |
671 printk(KERN_ERR "swim3: expected cyl %d, got %d\n", 672 fs->expect_cyl, fs->cur_cyl); | 717 swim3_err("Expected cyl %d, got %d\n", 718 fs->expect_cyl, fs->cur_cyl); |
673 fs->state = do_transfer; 674 act(fs); 675 } 676 break; 677 case seeking: 678 case jogging: 679 if (sw->nseek == 0) { 680 out_8(&sw->control_bic, DO_SEEK); --- 18 unchanged lines hidden (view full) --- 699 break; 700 out_8(&sw->intr_enable, 0); 701 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); 702 out_8(&sw->select, RELAX); 703 del_timer(&fs->timeout); 704 fs->timeout_pending = 0; 705 dr = fs->dma; 706 cp = fs->dma_cmd; | 719 fs->state = do_transfer; 720 act(fs); 721 } 722 break; 723 case seeking: 724 case jogging: 725 if (sw->nseek == 0) { 726 out_8(&sw->control_bic, DO_SEEK); --- 18 unchanged lines hidden (view full) --- 745 break; 746 out_8(&sw->intr_enable, 0); 747 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); 748 out_8(&sw->select, RELAX); 749 del_timer(&fs->timeout); 750 fs->timeout_pending = 0; 751 dr = fs->dma; 752 cp = fs->dma_cmd; |
707 if (rq_data_dir(fd_req) == WRITE) | 753 if (rq_data_dir(req) == WRITE) |
708 ++cp; 709 /* 710 * Check that the main data transfer has finished. 711 * On writing, the swim3 sometimes doesn't use 712 * up all the bytes of the postamble, so we can still 713 * see DMA active here. That doesn't matter as long 714 * as all the sector data has been transferred. 715 */ --- 8 unchanged lines hidden (view full) --- 724 } 725 /* turn off DMA */ 726 out_le32(&dr->control, (RUN | PAUSE) << 16); 727 stat = ld_le16(&cp->xfer_status); 728 resid = ld_le16(&cp->res_count); 729 if (intr & ERROR_INTR) { 730 n = fs->scount - 1 - resid / 512; 731 if (n > 0) { | 754 ++cp; 755 /* 756 * Check that the main data transfer has finished. 757 * On writing, the swim3 sometimes doesn't use 758 * up all the bytes of the postamble, so we can still 759 * see DMA active here. That doesn't matter as long 760 * as all the sector data has been transferred. 761 */ --- 8 unchanged lines hidden (view full) --- 770 } 771 /* turn off DMA */ 772 out_le32(&dr->control, (RUN | PAUSE) << 16); 773 stat = ld_le16(&cp->xfer_status); 774 resid = ld_le16(&cp->res_count); 775 if (intr & ERROR_INTR) { 776 n = fs->scount - 1 - resid / 512; 777 if (n > 0) { |
732 blk_update_request(fd_req, 0, n << 9); | 778 blk_update_request(req, 0, n << 9); |
733 fs->req_sector += n; 734 } 735 if (fs->retries < 5) { 736 ++fs->retries; 737 act(fs); 738 } else { | 779 fs->req_sector += n; 780 } 781 if (fs->retries < 5) { 782 ++fs->retries; 783 act(fs); 784 } else { |
739 printk("swim3: error %sing block %ld (err=%x)\n", 740 rq_data_dir(fd_req) == WRITE? "writ": "read", 741 (long)blk_rq_pos(fd_req), err); 742 swim3_end_request_cur(-EIO); | 785 swim3_err("Error %sing block %ld (err=%x)\n", 786 rq_data_dir(req) == WRITE? "writ": "read", 787 (long)blk_rq_pos(req), err); 788 swim3_end_request(fs, -EIO, 0); |
743 fs->state = idle; 744 } 745 } else { 746 if ((stat & ACTIVE) == 0 || resid != 0) { 747 /* musta been an error */ | 789 fs->state = idle; 790 } 791 } else { 792 if ((stat & ACTIVE) == 0 || resid != 0) { 793 /* musta been an error */ |
748 printk(KERN_ERR "swim3: fd dma: stat=%x resid=%d\n", stat, resid); 749 printk(KERN_ERR " state=%d, dir=%x, intr=%x, err=%x\n", 750 fs->state, rq_data_dir(fd_req), intr, err); 751 swim3_end_request_cur(-EIO); | 794 swim3_err("fd dma error: stat=%x resid=%d\n", stat, resid); 795 swim3_err(" state=%d, dir=%x, intr=%x, err=%x\n", 796 fs->state, rq_data_dir(req), intr, err); 797 swim3_end_request(fs, -EIO, 0); |
752 fs->state = idle; 753 start_request(fs); 754 break; 755 } | 798 fs->state = idle; 799 start_request(fs); 800 break; 801 } |
756 if (swim3_end_request(0, fs->scount << 9)) { | 802 fs->retries = 0; 803 if (swim3_end_request(fs, 0, fs->scount << 9)) { |
757 fs->req_sector += fs->scount; 758 if (fs->req_sector > fs->secpertrack) { 759 fs->req_sector -= fs->secpertrack; 760 if (++fs->head > 1) { 761 fs->head = 0; 762 ++fs->req_cyl; 763 } 764 } 765 act(fs); 766 } else 767 fs->state = idle; 768 } 769 if (fs->state == idle) 770 start_request(fs); 771 break; 772 default: | 804 fs->req_sector += fs->scount; 805 if (fs->req_sector > fs->secpertrack) { 806 fs->req_sector -= fs->secpertrack; 807 if (++fs->head > 1) { 808 fs->head = 0; 809 ++fs->req_cyl; 810 } 811 } 812 act(fs); 813 } else 814 fs->state = idle; 815 } 816 if (fs->state == idle) 817 start_request(fs); 818 break; 819 default: |
773 printk(KERN_ERR "swim3: don't know what to do in state %d\n", fs->state); | 820 swim3_err("Don't know what to do in state %d\n", fs->state); |
774 } | 821 } |
822 spin_unlock_irqrestore(&swim3_lock, flags); |
|
775 return IRQ_HANDLED; 776} 777 778/* 779static void fd_dma_interrupt(int irq, void *dev_id) 780{ 781} 782*/ 783 | 823 return IRQ_HANDLED; 824} 825 826/* 827static void fd_dma_interrupt(int irq, void *dev_id) 828{ 829} 830*/ 831 |
832/* Called under the mutex to grab exclusive access to a drive */ |
|
784static int grab_drive(struct floppy_state *fs, enum swim_state state, 785 int interruptible) 786{ 787 unsigned long flags; 788 | 833static int grab_drive(struct floppy_state *fs, enum swim_state state, 834 int interruptible) 835{ 836 unsigned long flags; 837 |
789 spin_lock_irqsave(&fs->lock, flags); 790 if (fs->state != idle) { | 838 swim3_dbg("%s", "-> grab drive\n"); 839 840 spin_lock_irqsave(&swim3_lock, flags); 841 if (fs->state != idle && fs->state != available) { |
791 ++fs->wanted; 792 while (fs->state != available) { | 842 ++fs->wanted; 843 while (fs->state != available) { |
844 spin_unlock_irqrestore(&swim3_lock, flags); |
|
793 if (interruptible && signal_pending(current)) { 794 --fs->wanted; | 845 if (interruptible && signal_pending(current)) { 846 --fs->wanted; |
795 spin_unlock_irqrestore(&fs->lock, flags); | |
796 return -EINTR; 797 } 798 interruptible_sleep_on(&fs->wait); | 847 return -EINTR; 848 } 849 interruptible_sleep_on(&fs->wait); |
850 spin_lock_irqsave(&swim3_lock, flags); |
|
799 } 800 --fs->wanted; 801 } 802 fs->state = state; | 851 } 852 --fs->wanted; 853 } 854 fs->state = state; |
803 spin_unlock_irqrestore(&fs->lock, flags); | 855 spin_unlock_irqrestore(&swim3_lock, flags); 856 |
804 return 0; 805} 806 807static void release_drive(struct floppy_state *fs) 808{ 809 unsigned long flags; 810 | 857 return 0; 858} 859 860static void release_drive(struct floppy_state *fs) 861{ 862 unsigned long flags; 863 |
811 spin_lock_irqsave(&fs->lock, flags); | 864 swim3_dbg("%s", "-> release drive\n"); 865 866 spin_lock_irqsave(&swim3_lock, flags); |
812 fs->state = idle; 813 start_request(fs); | 867 fs->state = idle; 868 start_request(fs); |
814 spin_unlock_irqrestore(&fs->lock, flags); | 869 spin_unlock_irqrestore(&swim3_lock, flags); |
815} 816 817static int fd_eject(struct floppy_state *fs) 818{ 819 int err, n; 820 821 err = grab_drive(fs, ejecting, 1); 822 if (err) --- 138 unchanged lines hidden (view full) --- 961 962 return ret; 963} 964 965static int floppy_release(struct gendisk *disk, fmode_t mode) 966{ 967 struct floppy_state *fs = disk->private_data; 968 struct swim3 __iomem *sw = fs->swim3; | 870} 871 872static int fd_eject(struct floppy_state *fs) 873{ 874 int err, n; 875 876 err = grab_drive(fs, ejecting, 1); 877 if (err) --- 138 unchanged lines hidden (view full) --- 1016 1017 return ret; 1018} 1019 1020static int floppy_release(struct gendisk *disk, fmode_t mode) 1021{ 1022 struct floppy_state *fs = disk->private_data; 1023 struct swim3 __iomem *sw = fs->swim3; |
1024 |
|
969 mutex_lock(&swim3_mutex); 970 if (fs->ref_count > 0 && --fs->ref_count == 0) { 971 swim3_action(fs, MOTOR_OFF); 972 out_8(&sw->control_bic, 0xff); 973 swim3_select(fs, RELAX); 974 } 975 mutex_unlock(&swim3_mutex); 976 return 0; --- 49 unchanged lines hidden (view full) --- 1026static const struct block_device_operations floppy_fops = { 1027 .open = floppy_unlocked_open, 1028 .release = floppy_release, 1029 .ioctl = floppy_ioctl, 1030 .check_events = floppy_check_events, 1031 .revalidate_disk= floppy_revalidate, 1032}; 1033 | 1025 mutex_lock(&swim3_mutex); 1026 if (fs->ref_count > 0 && --fs->ref_count == 0) { 1027 swim3_action(fs, MOTOR_OFF); 1028 out_8(&sw->control_bic, 0xff); 1029 swim3_select(fs, RELAX); 1030 } 1031 mutex_unlock(&swim3_mutex); 1032 return 0; --- 49 unchanged lines hidden (view full) --- 1082static const struct block_device_operations floppy_fops = { 1083 .open = floppy_unlocked_open, 1084 .release = floppy_release, 1085 .ioctl = floppy_ioctl, 1086 .check_events = floppy_check_events, 1087 .revalidate_disk= floppy_revalidate, 1088}; 1089 |
1090static void swim3_mb_event(struct macio_dev* mdev, int mb_state) 1091{ 1092 struct floppy_state *fs = macio_get_drvdata(mdev); 1093 struct swim3 __iomem *sw = fs->swim3; 1094 1095 if (!fs) 1096 return; 1097 if (mb_state != MB_FD) 1098 return; 1099 1100 /* Clear state */ 1101 out_8(&sw->intr_enable, 0); 1102 in_8(&sw->intr); 1103 in_8(&sw->error); 1104} 1105 |
|
1034static int swim3_add_device(struct macio_dev *mdev, int index) 1035{ 1036 struct device_node *swim = mdev->ofdev.dev.of_node; 1037 struct floppy_state *fs = &floppy_states[index]; 1038 int rc = -EBUSY; 1039 | 1106static int swim3_add_device(struct macio_dev *mdev, int index) 1107{ 1108 struct device_node *swim = mdev->ofdev.dev.of_node; 1109 struct floppy_state *fs = &floppy_states[index]; 1110 int rc = -EBUSY; 1111 |
1112 /* Do this first for message macros */ 1113 memset(fs, 0, sizeof(*fs)); 1114 fs->mdev = mdev; 1115 fs->index = index; 1116 |
|
1040 /* Check & Request resources */ 1041 if (macio_resource_count(mdev) < 2) { | 1117 /* Check & Request resources */ 1118 if (macio_resource_count(mdev) < 2) { |
1042 printk(KERN_WARNING "ifd%d: no address for %s\n", 1043 index, swim->full_name); | 1119 swim3_err("%s", "No address in device-tree\n"); |
1044 return -ENXIO; 1045 } | 1120 return -ENXIO; 1121 } |
1046 if (macio_irq_count(mdev) < 2) { 1047 printk(KERN_WARNING "fd%d: no intrs for device %s\n", 1048 index, swim->full_name); | 1122 if (macio_irq_count(mdev) < 1) { 1123 swim3_err("%s", "No interrupt in device-tree\n"); 1124 return -ENXIO; |
1049 } 1050 if (macio_request_resource(mdev, 0, "swim3 (mmio)")) { | 1125 } 1126 if (macio_request_resource(mdev, 0, "swim3 (mmio)")) { |
1051 printk(KERN_ERR "fd%d: can't request mmio resource for %s\n", 1052 index, swim->full_name); | 1127 swim3_err("%s", "Can't request mmio resource\n"); |
1053 return -EBUSY; 1054 } 1055 if (macio_request_resource(mdev, 1, "swim3 (dma)")) { | 1128 return -EBUSY; 1129 } 1130 if (macio_request_resource(mdev, 1, "swim3 (dma)")) { |
1056 printk(KERN_ERR "fd%d: can't request dma resource for %s\n", 1057 index, swim->full_name); | 1131 swim3_err("%s", "Can't request dma resource\n"); |
1058 macio_release_resource(mdev, 0); 1059 return -EBUSY; 1060 } 1061 dev_set_drvdata(&mdev->ofdev.dev, fs); 1062 1063 if (mdev->media_bay == NULL) 1064 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1); 1065 | 1132 macio_release_resource(mdev, 0); 1133 return -EBUSY; 1134 } 1135 dev_set_drvdata(&mdev->ofdev.dev, fs); 1136 1137 if (mdev->media_bay == NULL) 1138 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1); 1139 |
1066 memset(fs, 0, sizeof(*fs)); 1067 spin_lock_init(&fs->lock); | |
1068 fs->state = idle; 1069 fs->swim3 = (struct swim3 __iomem *) 1070 ioremap(macio_resource_start(mdev, 0), 0x200); 1071 if (fs->swim3 == NULL) { | 1140 fs->state = idle; 1141 fs->swim3 = (struct swim3 __iomem *) 1142 ioremap(macio_resource_start(mdev, 0), 0x200); 1143 if (fs->swim3 == NULL) { |
1072 printk("fd%d: couldn't map registers for %s\n", 1073 index, swim->full_name); | 1144 swim3_err("%s", "Couldn't map mmio registers\n"); |
1074 rc = -ENOMEM; 1075 goto out_release; 1076 } 1077 fs->dma = (struct dbdma_regs __iomem *) 1078 ioremap(macio_resource_start(mdev, 1), 0x200); 1079 if (fs->dma == NULL) { | 1145 rc = -ENOMEM; 1146 goto out_release; 1147 } 1148 fs->dma = (struct dbdma_regs __iomem *) 1149 ioremap(macio_resource_start(mdev, 1), 0x200); 1150 if (fs->dma == NULL) { |
1080 printk("fd%d: couldn't map DMA for %s\n", 1081 index, swim->full_name); | 1151 swim3_err("%s", "Couldn't map dma registers\n"); |
1082 iounmap(fs->swim3); 1083 rc = -ENOMEM; 1084 goto out_release; 1085 } 1086 fs->swim3_intr = macio_irq(mdev, 0); 1087 fs->dma_intr = macio_irq(mdev, 1); 1088 fs->cur_cyl = -1; 1089 fs->cur_sector = -1; 1090 fs->secpercyl = 36; 1091 fs->secpertrack = 18; 1092 fs->total_secs = 2880; | 1152 iounmap(fs->swim3); 1153 rc = -ENOMEM; 1154 goto out_release; 1155 } 1156 fs->swim3_intr = macio_irq(mdev, 0); 1157 fs->dma_intr = macio_irq(mdev, 1); 1158 fs->cur_cyl = -1; 1159 fs->cur_sector = -1; 1160 fs->secpercyl = 36; 1161 fs->secpertrack = 18; 1162 fs->total_secs = 2880; |
1093 fs->mdev = mdev; | |
1094 init_waitqueue_head(&fs->wait); 1095 1096 fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); 1097 memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); 1098 st_le16(&fs->dma_cmd[1].command, DBDMA_STOP); 1099 | 1163 init_waitqueue_head(&fs->wait); 1164 1165 fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); 1166 memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); 1167 st_le16(&fs->dma_cmd[1].command, DBDMA_STOP); 1168 |
1169 if (mdev->media_bay == NULL || check_media_bay(mdev->media_bay) == MB_FD) 1170 swim3_mb_event(mdev, MB_FD); 1171 |
|
1100 if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) { | 1172 if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) { |
1101 printk(KERN_ERR "fd%d: couldn't request irq %d for %s\n", 1102 index, fs->swim3_intr, swim->full_name); | 1173 swim3_err("%s", "Couldn't request interrupt\n"); |
1103 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0); 1104 goto out_unmap; 1105 return -EBUSY; 1106 } | 1174 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0); 1175 goto out_unmap; 1176 return -EBUSY; 1177 } |
1107/* 1108 if (request_irq(fs->dma_intr, fd_dma_interrupt, 0, "SWIM3-dma", fs)) { 1109 printk(KERN_ERR "Couldn't get irq %d for SWIM3 DMA", 1110 fs->dma_intr); 1111 return -EBUSY; 1112 } 1113*/ | |
1114 1115 init_timer(&fs->timeout); 1116 | 1178 1179 init_timer(&fs->timeout); 1180 |
1117 printk(KERN_INFO "fd%d: SWIM3 floppy controller %s\n", floppy_count, | 1181 swim3_info("SWIM3 floppy controller %s\n", |
1118 mdev->media_bay ? "in media bay" : ""); 1119 1120 return 0; 1121 1122 out_unmap: 1123 iounmap(fs->dma); 1124 iounmap(fs->swim3); 1125 1126 out_release: 1127 macio_release_resource(mdev, 0); 1128 macio_release_resource(mdev, 1); 1129 1130 return rc; 1131} 1132 1133static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match) 1134{ | 1182 mdev->media_bay ? "in media bay" : ""); 1183 1184 return 0; 1185 1186 out_unmap: 1187 iounmap(fs->dma); 1188 iounmap(fs->swim3); 1189 1190 out_release: 1191 macio_release_resource(mdev, 0); 1192 macio_release_resource(mdev, 1); 1193 1194 return rc; 1195} 1196 1197static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match) 1198{ |
1135 int i, rc; | |
1136 struct gendisk *disk; | 1199 struct gendisk *disk; |
1200 int index, rc; |
|
1137 | 1201 |
1202 index = floppy_count++; 1203 if (index >= MAX_FLOPPIES) 1204 return -ENXIO; 1205 |
|
1138 /* Add the drive */ | 1206 /* Add the drive */ |
1139 rc = swim3_add_device(mdev, floppy_count); | 1207 rc = swim3_add_device(mdev, index); |
1140 if (rc) 1141 return rc; | 1208 if (rc) 1209 return rc; |
1210 /* Now register that disk. Same comment about failure handling */ 1211 disk = disks[index] = alloc_disk(1); 1212 if (disk == NULL) 1213 return -ENOMEM; 1214 disk->queue = blk_init_queue(do_fd_request, &swim3_lock); 1215 if (disk->queue == NULL) { 1216 put_disk(disk); 1217 return -ENOMEM; 1218 } 1219 disk->queue->queuedata = &floppy_states[index]; |
|
1142 | 1220 |
1143 /* Now create the queue if not there yet */ 1144 if (swim3_queue == NULL) { | 1221 if (index == 0) { |
1145 /* If we failed, there isn't much we can do as the driver is still 1146 * too dumb to remove the device, just bail out 1147 */ 1148 if (register_blkdev(FLOPPY_MAJOR, "fd")) 1149 return 0; | 1222 /* If we failed, there isn't much we can do as the driver is still 1223 * too dumb to remove the device, just bail out 1224 */ 1225 if (register_blkdev(FLOPPY_MAJOR, "fd")) 1226 return 0; |
1150 swim3_queue = blk_init_queue(do_fd_request, &swim3_lock); 1151 if (swim3_queue == NULL) { 1152 unregister_blkdev(FLOPPY_MAJOR, "fd"); 1153 return 0; 1154 } | |
1155 } 1156 | 1227 } 1228 |
1157 /* Now register that disk. Same comment about failure handling */ 1158 i = floppy_count++; 1159 disk = disks[i] = alloc_disk(1); 1160 if (disk == NULL) 1161 return 0; 1162 | |
1163 disk->major = FLOPPY_MAJOR; | 1229 disk->major = FLOPPY_MAJOR; |
1164 disk->first_minor = i; | 1230 disk->first_minor = index; |
1165 disk->fops = &floppy_fops; | 1231 disk->fops = &floppy_fops; |
1166 disk->private_data = &floppy_states[i]; 1167 disk->queue = swim3_queue; | 1232 disk->private_data = &floppy_states[index]; |
1168 disk->flags |= GENHD_FL_REMOVABLE; | 1233 disk->flags |= GENHD_FL_REMOVABLE; |
1169 sprintf(disk->disk_name, "fd%d", i); | 1234 sprintf(disk->disk_name, "fd%d", index); |
1170 set_capacity(disk, 2880); 1171 add_disk(disk); 1172 1173 return 0; 1174} 1175 1176static struct of_device_id swim3_match[] = 1177{ --- 11 unchanged lines hidden (view full) --- 1189 1190static struct macio_driver swim3_driver = 1191{ 1192 .driver = { 1193 .name = "swim3", 1194 .of_match_table = swim3_match, 1195 }, 1196 .probe = swim3_attach, | 1235 set_capacity(disk, 2880); 1236 add_disk(disk); 1237 1238 return 0; 1239} 1240 1241static struct of_device_id swim3_match[] = 1242{ --- 11 unchanged lines hidden (view full) --- 1254 1255static struct macio_driver swim3_driver = 1256{ 1257 .driver = { 1258 .name = "swim3", 1259 .of_match_table = swim3_match, 1260 }, 1261 .probe = swim3_attach, |
1262#ifdef CONFIG_PMAC_MEDIABAY 1263 .mediabay_event = swim3_mb_event, 1264#endif |
|
1197#if 0 1198 .suspend = swim3_suspend, 1199 .resume = swim3_resume, 1200#endif 1201}; 1202 1203 1204int swim3_init(void) 1205{ 1206 macio_register_driver(&swim3_driver); 1207 return 0; 1208} 1209 1210module_init(swim3_init) 1211 1212MODULE_LICENSE("GPL"); 1213MODULE_AUTHOR("Paul Mackerras"); 1214MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR); | 1265#if 0 1266 .suspend = swim3_suspend, 1267 .resume = swim3_resume, 1268#endif 1269}; 1270 1271 1272int swim3_init(void) 1273{ 1274 macio_register_driver(&swim3_driver); 1275 return 0; 1276} 1277 1278module_init(swim3_init) 1279 1280MODULE_LICENSE("GPL"); 1281MODULE_AUTHOR("Paul Mackerras"); 1282MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR); |