diff --git a/Makefile b/Makefile index ea83721623e83dd2661b9ea955c2510c48476b0d..4682dfdbb96ca6ff9138c2631d7376788715c033 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 0 -EXTRAVERSION = -test4 +EXTRAVERSION = -test5 # *DOCUMENTATION* # To see a list of typical targets execute "make help" diff --git a/drivers/block/noop-iosched.c b/drivers/block/noop-iosched.c index 7511b955de70bb1e87a2dc78abb4de3afe6ef9da..ffef40be1f927afee43ffae4ad1285212d141652 100644 --- a/drivers/block/noop-iosched.c +++ b/drivers/block/noop-iosched.c @@ -24,8 +24,10 @@ int elevator_noop_merge(request_queue_t *q, struct request **req, struct request *__rq; int ret; - if ((ret = elv_try_last_merge(q, bio))) + if ((ret = elv_try_last_merge(q, bio))) { + *req = q->last_merge; return ret; + } while ((entry = entry->prev) != &q->queue_head) { __rq = list_entry_rq(entry); diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index e11984b2bb038055849c0c071566b4e25bcc6c78..b8dfd136058eea9fada8086cc696941a3661d6da 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c @@ -1719,9 +1719,9 @@ static void __exit exit_sdla(void) unregister_frad(devname); } -#endif MODULE_LICENSE("GPL"); module_init(init_sdla); module_exit(exit_sdla); +#endif diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index d7765bf8f224453565d5aae00ce486d005661366..8ded3cf74f28bc554524786040aa7075abd5ea46 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c @@ -398,7 +398,7 @@ static int sa1100_startup(struct uart_port *port) * Allocate the IRQ */ retval = request_irq(sport->port.irq, sa1100_int, 0, - "serial_sa1100", sport); + "sa11x0-uart", sport); if (retval) return retval; @@ -568,7 +568,7 @@ static int sa1100_request_port(struct uart_port *port) struct sa1100_port *sport = (struct sa1100_port *)port; return request_mem_region(sport->port.mapbase, UART_PORT_SIZE, - "serial_sa1100") != NULL ? 0 : -EBUSY; + "sa11x0-uart") != NULL ? 0 : -EBUSY; } /* @@ -858,71 +858,91 @@ static struct uart_driver sa1100_reg = { .cons = SA1100_CONSOLE, }; -static int sa1100_serial_suspend(struct device *dev, u32 state, u32 level) +static int sa1100_serial_suspend(struct device *_dev, u32 state, u32 level) { - int i; + struct sa1100_port *sport = dev_get_drvdata(_dev); + + if (sport) + uart_suspend_port(&sa1100_reg, &sport->port, level); + + return 0; +} + +static int sa1100_serial_resume(struct device *_dev, u32 level) +{ + struct sa1100_port *sport = dev_get_drvdata(_dev); - for (i = 0; i < NR_PORTS; i++) - uart_suspend_port(&sa1100_reg, &sa1100_ports[i].port, level); + if (sport) + uart_resume_port(&sa1100_reg, &sport->port, level); return 0; } -static int sa1100_serial_resume(struct device *dev, u32 level) +static int sa1100_serial_probe(struct device *_dev) { + struct platform_device *dev = to_platform_device(_dev); + struct resource *res = dev->resource; int i; - for (i = 0; i < NR_PORTS; i++) - uart_resume_port(&sa1100_reg, &sa1100_ports[i].port, level); + for (i = 0; i < dev->num_resources; i++, res++) + if (res->flags & IORESOURCE_MEM) + break; + + if (i < dev->num_resources) { + for (i = 0; i < NR_PORTS; i++) { + if (sa1100_ports[i].port.mapbase != res->start) + continue; + + uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port); + dev_set_drvdata(_dev, &sa1100_ports[i]); + break; + } + } + + return 0; +} + +static int sa1100_serial_remove(struct device *_dev) +{ + struct sa1100_port *sport = dev_get_drvdata(_dev); + + dev_set_drvdata(_dev, NULL); + + if (sport) + uart_remove_one_port(&sa1100_reg, &sport->port); return 0; } static struct device_driver sa11x0_serial_driver = { - .name = "sa11x0_serial", - .bus = &system_bus_type, + .name = "sa11x0-uart", + .bus = &platform_bus_type, + .probe = sa1100_serial_probe, + .remove = sa1100_serial_remove, .suspend = sa1100_serial_suspend, .resume = sa1100_serial_resume, }; -/* - * This "device" covers _all_ ISA 8250-compatible serial devices. - */ -static struct sys_device sa11x0_serial_devs = { - .name = "sa11x0_serial", - .id = 0, - .dev = { - .driver = &sa11x0_serial_driver, - }, -}; - static int __init sa1100_serial_init(void) { int ret; printk(KERN_INFO "Serial: SA11x0 driver $Revision: 1.50 $\n"); - driver_register(&sa11x0_serial_driver); - sys_device_register(&sa11x0_serial_devs); - sa1100_init_ports(); + ret = uart_register_driver(&sa1100_reg); if (ret == 0) { - int i; - - for (i = 0; i < NR_PORTS; i++) - uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port); + ret = driver_register(&sa11x0_serial_driver); + if (ret) + uart_unregister_driver(&sa1100_reg); } return ret; } static void __exit sa1100_serial_exit(void) { - int i; - - for (i = 0; i < NR_PORTS; i++) - uart_remove_one_port(&sa1100_reg, &sa1100_ports[i].port); - + driver_unregister(&sa11x0_serial_driver); uart_unregister_driver(&sa1100_reg); } diff --git a/include/asm-i386/ioctl.h b/include/asm-i386/ioctl.h index c75f20ade6b9311292efbf94a07860448f39402a..2e98645a3788acf0356ac39513b442de9b28db19 100644 --- a/include/asm-i386/ioctl.h +++ b/include/asm-i386/ioctl.h @@ -52,11 +52,21 @@ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT)) +/* provoke compile error for invalid uses of size argument */ +extern int __invalid_size_argument_for_IOC; +#define _IOC_TYPECHECK(t) \ + ((sizeof(t) == sizeof(t[1]) && \ + sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ + sizeof(t) : __invalid_size_argument_for_IOC) + /* used to create numbers */ #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) -#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) -#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) -#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) +#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) +#define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) +#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) /* used to decode ioctl numbers.. */ #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h index 5f64cc2cf4e4536e5f37378e9166ca90b3738f24..84d73d20cc83102a56817f99f223294e1a96f8e8 100644 --- a/include/sound/hdsp.h +++ b/include/sound/hdsp.h @@ -71,7 +71,8 @@ struct _snd_hdsp_firmware { unsigned long firmware_data[24413]; }; -#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, hdsp_firmware_t) +/* This ioctl is marked bad because the type is bigger than the IOCTL description */ +#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW_BAD('H', 0x42, hdsp_firmware_t) typedef struct _snd_hdsp_version hdsp_version_t; diff --git a/include/sound/sscape_ioctl.h b/include/sound/sscape_ioctl.h index baaa75e258f90ce9a1cdfacb93a7d4658d7c5300..aadc930a6ba4767b5b48d82b26b50bd02c59174f 100644 --- a/include/sound/sscape_ioctl.h +++ b/include/sound/sscape_ioctl.h @@ -14,6 +14,8 @@ struct sscape_microcode }; #define SND_SSCAPE_LOAD_BOOTB _IOWR('P', 100, struct sscape_bootblock) -#define SND_SSCAPE_LOAD_MCODE _IOW('P', 101, struct sscape_microcode) + +/* This ioctl is marked bad because the type is bigger than the IOCTL description */ +#define SND_SSCAPE_LOAD_MCODE _IOW_BAD('P', 101, struct sscape_microcode) #endif