21 #include <linux/stddef.h>
22 #include <linux/kernel.h>
23 #include <linux/sched.h>
31 #include <linux/module.h>
36 #include <asm/uaccess.h>
38 #include <asm/machdep.h>
41 #define MAX_FLOPPIES 2
58 #define REG(x) unsigned char x; char x ## _pad[15];
83 #define control_bic control
84 #define control_bis status
94 #define WRITE_SECTORS 0x10
95 #define DO_ACTION 0x08
96 #define DRIVE2_ENABLE 0x04
97 #define DRIVE_ENABLE 0x02
98 #define INTR_ENABLE 0x01
101 #define FIFO_1BYTE 0x80
102 #define FIFO_2BYTE 0x40
106 #define INTR_PENDING 0x02
107 #define MARK_BYTE 0x01
110 #define ERROR_INTR 0x20
111 #define DATA_CHANGED 0x10
112 #define TRANSFER_DONE 0x08
113 #define SEEN_SECTOR 0x04
114 #define SEEK_DONE 0x02
115 #define TIMER_DONE 0x01
118 #define ERR_DATA_CRC 0x80
119 #define ERR_ADDR_CRC 0x40
120 #define ERR_OVERRUN 0x04
121 #define ERR_UNDERRUN 0x01
124 #define S_SW_RESET 0x80
125 #define S_GCR_WRITE 0x40
126 #define S_IBM_DRIVE 0x20
127 #define S_TEST_MODE 0x10
128 #define S_FCLK_DIV2 0x08
130 #define S_COPY_PROT 0x02
131 #define S_INV_WDATA 0x01
134 #define SEEK_POSITIVE 0
135 #define SEEK_NEGATIVE 4
149 #define READ_DATA_0 4
150 #define TWOMEG_DRIVE 5
151 #define SINGLE_SIDED 6
152 #define DRIVE_PRESENT 7
155 #define TRACK_ZERO 10
157 #define READ_DATA_1 12
159 #define SEEK_COMPLETE 14
160 #define ONEMEG_MEDIA 15
163 #define DATA_ESCAPE 0x99
164 #define GCR_SYNC_EXC 0x3f
165 #define GCR_SYNC_CONV 0x80
166 #define GCR_FIRST_MARK 0xd5
167 #define GCR_SECOND_MARK 0xaa
168 #define GCR_ADDR_MARK "\xd5\xaa\x00"
169 #define GCR_DATA_MARK "\xd5\xaa\x0b"
170 #define GCR_SLIP_BYTE "\x27\xaa"
171 #define GCR_SELF_SYNC "\x3f\xbf\x1e\x34\x3c\x3f"
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
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)
215 #define swim3_dbg(fmt, arg...) dev_dbg(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg)
217 #define swim3_dbg(fmt, arg...) do { } while(0)
221 static int floppy_count = 0;
224 static unsigned short write_preamble[] = {
225 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4e,
227 0x99a1, 0x99a1, 0x99a1, 0x99fb,
231 static unsigned short write_postamble[] = {
239 static void init_dma(
struct dbdma_cmd *
cp,
int cmd,
void *
buf,
int count);
241 static void scan_timeout(
unsigned long data);
242 static void seek_timeout(
unsigned long data);
243 static void settle_timeout(
unsigned long data);
244 static void xfer_timeout(
unsigned long data);
252 unsigned int cmd,
unsigned long param);
255 static unsigned int floppy_check_events(
struct gendisk *
disk,
256 unsigned int clearing);
257 static int floppy_revalidate(
struct gendisk *
disk);
259 static bool swim3_end_request(
struct floppy_state *
fs,
int err,
unsigned int nr_bytes)
264 swim3_dbg(
" end request, err=%d nr_bytes=%d, cur_req=%p\n",
268 nr_bytes = blk_rq_cur_bytes(req);
292 swim3_select(fs, action);
305 swim3_select(fs, bit);
307 stat =
in_8(&sw->status);
308 return (stat &
DATA) == 0;
333 if (fs->
mdev->media_bay &&
335 swim3_dbg(
"%s",
" media bay absent, dropping req\n");
336 swim3_end_request(fs, -
ENODEV, 0);
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),
345 swim3_dbg(
" errors=%d current_nr_sectors=%u\n",
346 req->errors, blk_rq_cur_sectors(req));
350 swim3_dbg(
" pos out of bounds (%ld, max is %ld)\n",
352 swim3_end_request(fs, -
EIO, 0);
357 swim3_end_request(fs, -
EIO, 0);
361 if (rq_data_dir(req) ==
WRITE) {
365 swim3_dbg(
"%s",
" try to write, disk write protected\n");
366 swim3_end_request(fs, -
EIO, 0);
378 x = ((
long)blk_rq_pos(req)) % fs->
secpercyl;
390 start_request(q->queuedata);
393 static void set_timeout(
struct floppy_state *fs,
int nticks,
394 void (*proc)(
unsigned long))
415 set_timeout(fs,
HZ, scan_timeout);
418 static inline void seek_track(
struct floppy_state *fs,
int n)
430 swim3_select(fs,
STEP);
435 set_timeout(fs, 3*
HZ, seek_timeout);
439 static inline void init_dma(
struct dbdma_cmd *
cp,
int cmd,
442 st_le16(&cp->req_count, count);
443 st_le16(&cp->command, cmd);
448 static inline void setup_transfer(
struct floppy_state *fs)
452 struct dbdma_cmd *cp = fs->
dma_cmd;
456 if (blk_rq_cur_sectors(req) <= 0) {
460 if (rq_data_dir(req) ==
WRITE)
464 if (n > blk_rq_cur_sectors(req))
465 n = blk_rq_cur_sectors(req);
468 swim3_dbg(
" setup xfer at sect %d (of %d) head %d for %d\n",
474 out_8(&sw->nsect, n);
477 if (rq_data_dir(req) ==
WRITE) {
479 init_dma(cp, OUTPUT_MORE, write_preamble,
sizeof(write_preamble));
481 init_dma(cp, OUTPUT_MORE, req->buffer, 512);
483 init_dma(cp, OUTPUT_LAST, write_postamble,
sizeof(write_postamble));
485 init_dma(cp, INPUT_LAST, req->buffer, n * 512);
492 if (rq_data_dir(req) ==
WRITE)
499 set_timeout(fs, 2*
HZ, xfer_timeout);
505 swim3_dbg(
" act loop, state=%d, req_cyl=%d, cur_cyl=%d\n",
548 swim3_err(
"Wrong cylinder in transfer, want: %d got %d\n",
550 swim3_end_request(fs, -
EIO, 0);
571 static void scan_timeout(
unsigned long data)
583 out_8(&sw->intr_enable, 0);
586 swim3_end_request(fs, -
EIO, 0);
593 spin_unlock_irqrestore(&swim3_lock, flags);
596 static void seek_timeout(
unsigned long data)
608 out_8(&sw->intr_enable, 0);
610 swim3_end_request(fs, -
EIO, 0);
613 spin_unlock_irqrestore(&swim3_lock, flags);
616 static void settle_timeout(
unsigned long data)
635 set_timeout(fs, 1, settle_timeout);
638 swim3_err(
"%s",
"Seek settle timeout\n");
639 swim3_end_request(fs, -
EIO, 0);
643 spin_unlock_irqrestore(&swim3_lock, flags);
646 static void xfer_timeout(
unsigned long data)
660 for (n = 0; (
in_le32(&dr->status) &
ACTIVE) && n < 1000; n++)
662 out_8(&sw->intr_enable, 0);
667 (
long)blk_rq_pos(fs->
cur_req));
668 swim3_end_request(fs, -
EIO, 0);
671 spin_unlock_irqrestore(&swim3_lock, flags);
681 struct dbdma_cmd *
cp;
688 intr =
in_8(&sw->intr);
691 swim3_err(
"Non-transfer error interrupt: state=%d, dir=%x, intr=%x, err=%x\n",
698 out_8(&sw->intr_enable, 0);
701 if (sw->ctrack == 0xff) {
702 swim3_err(
"%s",
"Seen sector but cyl=ff?\n");
705 swim3_end_request(fs, -
EIO, 0);
725 if (sw->nseek == 0) {
728 out_8(&sw->intr_enable, 0);
738 out_8(&sw->intr_enable, 0);
746 out_8(&sw->intr_enable, 0);
753 if (rq_data_dir(req) ==
WRITE)
762 if ((intr & ERROR_INTR) == 0 && cp->xfer_status == 0) {
764 for (n = 0; n < 100; ++
n) {
765 if (cp->xfer_status != 0)
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;
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);
792 if ((stat &
ACTIVE) == 0 || resid != 0) {
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);
803 if (swim3_end_request(fs, 0, fs->
scount << 9)) {
807 if (++fs->
head > 1) {
822 spin_unlock_irqrestore(&swim3_lock, flags);
844 spin_unlock_irqrestore(&swim3_lock, flags);
845 if (interruptible && signal_pending(
current)) {
855 spin_unlock_irqrestore(&swim3_lock, flags);
869 spin_unlock_irqrestore(&swim3_lock, flags);
879 swim3_action(fs,
EJECT);
880 for (n = 20; n > 0; --
n) {
885 swim3_select(fs,
RELAX);
887 if (swim3_readbit(fs,
DISK_IN) == 0)
890 swim3_select(fs,
RELAX);
898 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,
NULL };
901 unsigned int cmd,
unsigned long param)
909 if (fs->
mdev->media_bay &&
929 unsigned int cmd,
unsigned long param)
934 ret = floppy_locked_ioctl(bdev, mode, cmd, param);
947 if (fs->
mdev->media_bay &&
951 out_8(&sw->control_bic, 0xff);
952 out_8(&sw->mode, 0x95);
954 out_8(&sw->intr_enable, 0);
959 for (n = 0; n < 2 *
HZ; ++
n) {
966 swim3_select(fs,
RELAX);
970 || swim3_readbit(fs,
DISK_IN) == 0))
973 swim3_select(fs,
RELAX);
996 swim3_select(fs,
RELAX);
1001 if (mode & FMODE_EXCL)
1014 ret = floppy_open(bdev, mode);
1020 static int floppy_release(
struct gendisk *disk,
fmode_t mode)
1028 out_8(&sw->control_bic, 0xff);
1029 swim3_select(fs,
RELAX);
1035 static unsigned int floppy_check_events(
struct gendisk *disk,
1036 unsigned int clearing)
1039 return fs->
ejected ? DISK_EVENT_MEDIA_CHANGE : 0;
1042 static int floppy_revalidate(
struct gendisk *disk)
1048 if (fs->
mdev->media_bay &&
1054 out_8(&sw->intr_enable, 0);
1060 for (n = HZ; n > 0; --
n) {
1065 swim3_select(fs,
RELAX);
1069 || swim3_readbit(fs,
DISK_IN) == 0;
1074 swim3_action(fs,
SETMFM);
1076 swim3_select(fs,
RELAX);
1082 static 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,
1090 static void swim3_mb_event(
struct macio_dev* mdev,
int mb_state)
1097 if (mb_state != MB_FD)
1101 out_8(&sw->intr_enable, 0);
1106 static int swim3_add_device(
struct macio_dev *mdev,
int index)
1113 memset(fs, 0,
sizeof(*fs));
1118 if (macio_resource_count(mdev) < 2) {
1119 swim3_err(
"%s",
"No address in device-tree\n");
1122 if (macio_irq_count(mdev) < 1) {
1123 swim3_err(
"%s",
"No interrupt in device-tree\n");
1127 swim3_err(
"%s",
"Can't request mmio resource\n");
1131 swim3_err(
"%s",
"Can't request dma resource\n");
1137 if (mdev->media_bay ==
NULL)
1138 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1);
1142 ioremap(macio_resource_start(mdev, 0), 0x200);
1144 swim3_err(
"%s",
"Couldn't map mmio registers\n");
1149 ioremap(macio_resource_start(mdev, 1), 0x200);
1151 swim3_err(
"%s",
"Couldn't map dma registers\n");
1167 st_le16(&fs->
dma_cmd[1].command, DBDMA_STOP);
1170 swim3_mb_event(mdev, MB_FD);
1173 swim3_err(
"%s",
"Couldn't request interrupt\n");
1174 pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0);
1182 mdev->media_bay ?
"in media bay" :
"");
1199 struct gendisk *disk;
1202 index = floppy_count++;
1207 rc = swim3_add_device(mdev, index);
1215 if (disk->queue ==
NULL) {
1219 disk->queue->queuedata = &floppy_states[
index];
1230 disk->first_minor =
index;
1231 disk->fops = &floppy_fops;
1232 disk->private_data = &floppy_states[
index];
1233 disk->flags |= GENHD_FL_REMOVABLE;
1234 sprintf(disk->disk_name,
"fd%d", index);
1235 set_capacity(disk, 2880);
1247 .compatible =
"ohare-swim3"
1250 .compatible =
"swim3"
1255 static struct macio_driver swim3_driver =
1259 .of_match_table = swim3_match,
1261 .probe = swim3_attach,
1262 #ifdef CONFIG_PMAC_MEDIABAY
1263 .mediabay_event = swim3_mb_event,
1266 .suspend = swim3_suspend,
1267 .resume = swim3_resume,