Commit 4358a844 authored by Jens Axboe's avatar Jens Axboe
Browse files

Merge branch 'for-4.15/timer' into for-linus

Post initial pull timer related changes for block drivers. Not merged
with the first pull, since they were dependent on this commit in
mainline:

commit 686fef92
Author: Kees Cook <keescook@chromium.org>
Date:   Thu Sep 28 06:38:17 2017 -0700

    timer: Prepare to change timer callback argument type
parents a33801e8 8376d3c1
Loading
Loading
Loading
Loading
+26 −31
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ static struct amiga_floppy_struct unit[FD_MAX_UNITS];

static struct timer_list flush_track_timer[FD_MAX_UNITS];
static struct timer_list post_write_timer;
static unsigned long post_write_timer_drive;
static struct timer_list motor_on_timer;
static struct timer_list motor_off_timer[FD_MAX_UNITS];
static int on_attempts;
@@ -323,7 +324,7 @@ static void fd_deselect (int drive)

}

static void motor_on_callback(unsigned long ignored)
static void motor_on_callback(struct timer_list *unused)
{
	if (!(ciaa.pra & DSKRDY) || --on_attempts == 0) {
		complete_all(&motor_on_completion);
@@ -355,7 +356,7 @@ static int fd_motor_on(int nr)
		on_attempts = -1;
#if 0
		printk (KERN_ERR "motor_on failed, turning motor off\n");
		fd_motor_off (nr);
		fd_motor_off (motor_off_timer + nr);
		return 0;
#else
		printk (KERN_WARNING "DSKRDY not set after 1.5 seconds - assuming drive is spinning notwithstanding\n");
@@ -365,20 +366,17 @@ static int fd_motor_on(int nr)
	return 1;
}

static void fd_motor_off(unsigned long drive)
static void fd_motor_off(struct timer_list *timer)
{
	long calledfromint;
#ifdef MODULE
	long decusecount;
	unsigned long drive = ((unsigned long)timer -
			       (unsigned long)&motor_off_timer[0]) /
					sizeof(motor_off_timer[0]);

	decusecount = drive & 0x40000000;
#endif
	calledfromint = drive & 0x80000000;
	drive&=3;
	if (calledfromint && !try_fdc(drive)) {
	if (!try_fdc(drive)) {
		/* We would be blocked in an interrupt, so try again later */
		motor_off_timer[drive].expires = jiffies + 1;
		add_timer(motor_off_timer + drive);
		timer->expires = jiffies + 1;
		add_timer(timer);
		return;
	}
	unit[drive].motor = 0;
@@ -392,8 +390,6 @@ static void floppy_off (unsigned int nr)
	int drive;

	drive = nr & 3;
	/* called this way it is always from interrupt */
	motor_off_timer[drive].data = nr | 0x80000000;
	mod_timer(motor_off_timer + drive, jiffies + 3*HZ);
}

@@ -435,7 +431,7 @@ static int fd_calibrate(int drive)
			break;
		if (--n == 0) {
			printk (KERN_ERR "fd%d: calibrate failed, turning motor off\n", drive);
			fd_motor_off (drive);
			fd_motor_off (motor_off_timer + drive);
			unit[drive].track = -1;
			rel_fdc();
			return 0;
@@ -564,7 +560,7 @@ static irqreturn_t fd_block_done(int irq, void *dummy)
	if (block_flag == 2) { /* writing */
		writepending = 2;
		post_write_timer.expires = jiffies + 1; /* at least 2 ms */
		post_write_timer.data = selected;
		post_write_timer_drive = selected;
		add_timer(&post_write_timer);
	}
	else {                /* reading */
@@ -651,6 +647,10 @@ static void post_write (unsigned long drive)
	rel_fdc(); /* corresponds to get_fdc() in raw_write */
}

static void post_write_callback(struct timer_list *timer)
{
	post_write(post_write_timer_drive);
}

/*
 * The following functions are to convert the block contents into raw data
@@ -1244,8 +1244,12 @@ static void dos_write(int disk)
/* FIXME: this assumes the drive is still spinning -
 * which is only true if we complete writing a track within three seconds
 */
static void flush_track_callback(unsigned long nr)
static void flush_track_callback(struct timer_list *timer)
{
	unsigned long nr = ((unsigned long)timer -
			       (unsigned long)&flush_track_timer[0]) /
					sizeof(flush_track_timer[0]);

	nr&=3;
	writefromint = 1;
	if (!try_fdc(nr)) {
@@ -1649,8 +1653,7 @@ static void floppy_release(struct gendisk *disk, fmode_t mode)
		fd_ref[drive] = 0;
	}
#ifdef MODULE
/* the mod_use counter is handled this way */
	floppy_off (drive | 0x40000000);
	floppy_off (drive);
#endif
	mutex_unlock(&amiflop_mutex);
}
@@ -1791,27 +1794,19 @@ static int __init amiga_floppy_probe(struct platform_device *pdev)
				floppy_find, NULL, NULL);

	/* initialize variables */
	init_timer(&motor_on_timer);
	timer_setup(&motor_on_timer, motor_on_callback, 0);
	motor_on_timer.expires = 0;
	motor_on_timer.data = 0;
	motor_on_timer.function = motor_on_callback;
	for (i = 0; i < FD_MAX_UNITS; i++) {
		init_timer(&motor_off_timer[i]);
		timer_setup(&motor_off_timer[i], fd_motor_off, 0);
		motor_off_timer[i].expires = 0;
		motor_off_timer[i].data = i|0x80000000;
		motor_off_timer[i].function = fd_motor_off;
		init_timer(&flush_track_timer[i]);
		timer_setup(&flush_track_timer[i], flush_track_callback, 0);
		flush_track_timer[i].expires = 0;
		flush_track_timer[i].data = i;
		flush_track_timer[i].function = flush_track_callback;

		unit[i].track = -1;
	}

	init_timer(&post_write_timer);
	timer_setup(&post_write_timer, post_write_callback, 0);
	post_write_timer.expires = 0;
	post_write_timer.data = 0;
	post_write_timer.function = post_write;
  
	for (i = 0; i < 128; i++)
		mfmdecode[i]=255;
+3 −3
Original line number Diff line number Diff line
@@ -744,7 +744,7 @@ count_targets(struct aoedev *d, int *untainted)
}

static void
rexmit_timer(ulong vp)
rexmit_timer(struct timer_list *timer)
{
	struct aoedev *d;
	struct aoetgt *t;
@@ -758,7 +758,7 @@ rexmit_timer(ulong vp)
	int utgts;	/* number of aoetgt descriptors (not slots) */
	int since;

	d = (struct aoedev *) vp;
	d = from_timer(d, timer, timer);

	spin_lock_irqsave(&d->lock, flags);

@@ -1429,7 +1429,7 @@ aoecmd_ata_id(struct aoedev *d)

	d->rttavg = RTTAVG_INIT;
	d->rttdev = RTTDEV_INIT;
	d->timer.function = rexmit_timer;
	d->timer.function = (TIMER_FUNC_TYPE)rexmit_timer;

	skb = skb_clone(skb, GFP_ATOMIC);
	if (skb) {
+3 −6
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
#include <linux/string.h>
#include "aoe.h"

static void dummy_timer(ulong);
static void freetgt(struct aoedev *d, struct aoetgt *t);
static void skbpoolfree(struct aoedev *d);

@@ -146,11 +145,11 @@ aoedev_put(struct aoedev *d)
}

static void
dummy_timer(ulong vp)
dummy_timer(struct timer_list *t)
{
	struct aoedev *d;

	d = (struct aoedev *)vp;
	d = from_timer(d, t, timer);
	if (d->flags & DEVFL_TKILL)
		return;
	d->timer.expires = jiffies + HZ;
@@ -466,9 +465,7 @@ aoedev_by_aoeaddr(ulong maj, int min, int do_alloc)
	INIT_WORK(&d->work, aoecmd_sleepwork);
	spin_lock_init(&d->lock);
	skb_queue_head_init(&d->skbpool);
	init_timer(&d->timer);
	d->timer.data = (ulong) d;
	d->timer.function = dummy_timer;
	timer_setup(&d->timer, dummy_timer, 0);
	d->timer.expires = jiffies + HZ;
	add_timer(&d->timer);
	d->bufpool = NULL;	/* defer to aoeblk_gdalloc */
+7 −3
Original line number Diff line number Diff line
@@ -903,10 +903,14 @@ static void unlock_fdc(void)
}

/* switches the motor off after a given timeout */
static void motor_off_callback(unsigned long nr)
static void motor_off_callback(struct timer_list *t)
{
	unsigned long nr = t - motor_off_timer;
	unsigned char mask = ~(0x10 << UNIT(nr));

	if (WARN_ON_ONCE(nr >= N_DRIVE))
		return;

	set_dor(FDC(nr), mask, 0);
}

@@ -3047,7 +3051,7 @@ static void raw_cmd_done(int flag)
		else
			raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
		if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
			motor_off_callback(current_drive);
			motor_off_callback(&motor_off_timer[current_drive]);

		if (raw_cmd->next &&
		    (!(raw_cmd->flags & FD_RAW_FAILURE) ||
@@ -4542,7 +4546,7 @@ static int __init do_floppy_init(void)
		disks[drive]->fops = &floppy_fops;
		sprintf(disks[drive]->disk_name, "fd%d", drive);

		setup_timer(&motor_off_timer[drive], motor_off_callback, drive);
		timer_setup(&motor_off_timer[drive], motor_off_callback, 0);
	}

	err = register_blkdev(FLOPPY_MAJOR, "fd");
+15 −16
Original line number Diff line number Diff line
@@ -239,10 +239,10 @@ static unsigned short write_postamble[] = {
static void seek_track(struct floppy_state *fs, int n);
static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count);
static void act(struct floppy_state *fs);
static void scan_timeout(unsigned long data);
static void seek_timeout(unsigned long data);
static void settle_timeout(unsigned long data);
static void xfer_timeout(unsigned long data);
static void scan_timeout(struct timer_list *t);
static void seek_timeout(struct timer_list *t);
static void settle_timeout(struct timer_list *t);
static void xfer_timeout(struct timer_list *t);
static irqreturn_t swim3_interrupt(int irq, void *dev_id);
/*static void fd_dma_interrupt(int irq, void *dev_id);*/
static int grab_drive(struct floppy_state *fs, enum swim_state state,
@@ -392,13 +392,12 @@ static void do_fd_request(struct request_queue * q)
}

static void set_timeout(struct floppy_state *fs, int nticks,
			void (*proc)(unsigned long))
			void (*proc)(struct timer_list *t))
{
	if (fs->timeout_pending)
		del_timer(&fs->timeout);
	fs->timeout.expires = jiffies + nticks;
	fs->timeout.function = proc;
	fs->timeout.data = (unsigned long) fs;
	fs->timeout.function = (TIMER_FUNC_TYPE)proc;
	add_timer(&fs->timeout);
	fs->timeout_pending = 1;
}
@@ -569,9 +568,9 @@ static void act(struct floppy_state *fs)
	}
}

static void scan_timeout(unsigned long data)
static void scan_timeout(struct timer_list *t)
{
	struct floppy_state *fs = (struct floppy_state *) data;
	struct floppy_state *fs = from_timer(fs, t, timeout);
	struct swim3 __iomem *sw = fs->swim3;
	unsigned long flags;

@@ -594,9 +593,9 @@ static void scan_timeout(unsigned long data)
	spin_unlock_irqrestore(&swim3_lock, flags);
}

static void seek_timeout(unsigned long data)
static void seek_timeout(struct timer_list *t)
{
	struct floppy_state *fs = (struct floppy_state *) data;
	struct floppy_state *fs = from_timer(fs, t, timeout);
	struct swim3 __iomem *sw = fs->swim3;
	unsigned long flags;

@@ -614,9 +613,9 @@ static void seek_timeout(unsigned long data)
	spin_unlock_irqrestore(&swim3_lock, flags);
}

static void settle_timeout(unsigned long data)
static void settle_timeout(struct timer_list *t)
{
	struct floppy_state *fs = (struct floppy_state *) data;
	struct floppy_state *fs = from_timer(fs, t, timeout);
	struct swim3 __iomem *sw = fs->swim3;
	unsigned long flags;

@@ -644,9 +643,9 @@ static void settle_timeout(unsigned long data)
	spin_unlock_irqrestore(&swim3_lock, flags);
}

static void xfer_timeout(unsigned long data)
static void xfer_timeout(struct timer_list *t)
{
	struct floppy_state *fs = (struct floppy_state *) data;
	struct floppy_state *fs = from_timer(fs, t, timeout);
	struct swim3 __iomem *sw = fs->swim3;
	struct dbdma_regs __iomem *dr = fs->dma;
	unsigned long flags;
@@ -1182,7 +1181,7 @@ static int swim3_add_device(struct macio_dev *mdev, int index)
		return -EBUSY;
	}

	init_timer(&fs->timeout);
	timer_setup(&fs->timeout, NULL, 0);

	swim3_info("SWIM3 floppy controller %s\n",
		mdev->media_bay ? "in media bay" : "");
Loading