From 70f1068461fcd993d2e61699de70ae75c402de33 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Mon, 19 Nov 2007 20:27:46 +0100 Subject: [PATCH] --- yaml --- r: 75028 b: refs/heads/master c: 74cda169fe65ca1dedad6d4a905b13c6ccd87351 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/Documentation/i2c/summary | 45 ++- trunk/MAINTAINERS | 6 + trunk/arch/sparc64/kernel/smp.c | 19 +- trunk/arch/um/drivers/net_kern.c | 2 +- trunk/arch/xtensa/platform-iss/network.c | 4 +- trunk/drivers/i2c/busses/i2c-davinci.c | 4 +- trunk/drivers/i2c/busses/i2c-gpio.c | 1 - trunk/drivers/i2c/busses/i2c-omap.c | 6 +- trunk/drivers/i2c/chips/isp1301_omap.c | 2 +- trunk/drivers/media/common/saa7146_video.c | 11 +- trunk/drivers/media/dvb/dvb-usb/Makefile | 3 - .../drivers/media/dvb/dvb-usb/dibusb-common.c | 4 - trunk/drivers/media/dvb/frontends/tda10086.c | 14 +- trunk/drivers/media/dvb/frontends/zl10353.c | 4 +- trunk/drivers/media/dvb/frontends/zl10353.h | 2 +- trunk/drivers/media/video/bt8xx/bttv-cards.c | 2 +- trunk/drivers/media/video/bt8xx/bttv-driver.c | 9 +- .../drivers/media/video/cx88/cx88-blackbird.c | 5 +- trunk/drivers/media/video/cx88/cx88-video.c | 5 +- .../drivers/media/video/em28xx/em28xx-video.c | 7 +- trunk/drivers/media/video/ivtv/ivtv-i2c.c | 2 +- trunk/drivers/media/video/ivtv/ivtv-i2c.h | 2 +- trunk/drivers/media/video/ivtv/ivtv-streams.c | 2 +- trunk/drivers/media/video/saa5246a.c | 10 +- trunk/drivers/media/video/saa5249.c | 8 +- .../media/video/saa7134/saa7134-alsa.c | 16 +- .../media/video/saa7134/saa7134-cards.c | 2 +- .../media/video/saa7134/saa7134-core.c | 21 +- .../drivers/media/video/saa7134/saa7134-dvb.c | 1 - .../media/video/saa7134/saa7134-empress.c | 5 +- .../media/video/saa7134/saa7134-video.c | 5 +- trunk/drivers/media/video/tvp5150.c | 11 - trunk/drivers/media/video/videobuf-core.c | 259 ++++++------------ trunk/drivers/media/video/videobuf-vmalloc.c | 6 +- trunk/drivers/media/video/vivi.c | 1 - trunk/drivers/net/Kconfig | 1 + trunk/drivers/net/bnx2.c | 35 ++- trunk/drivers/net/bnx2.h | 1 + trunk/drivers/net/e100.c | 5 +- trunk/drivers/net/hamachi.c | 70 +++-- trunk/drivers/net/ibm_newemac/debug.c | 2 +- trunk/drivers/net/ixgb/ixgb_main.c | 16 +- trunk/drivers/net/pcmcia/pcnet_cs.c | 1 - trunk/drivers/net/s2io.c | 4 +- trunk/drivers/net/sis190.c | 10 +- trunk/drivers/net/sky2.c | 9 +- trunk/drivers/net/smc911x.h | 2 +- trunk/drivers/net/starfire.c | 2 +- trunk/drivers/net/sundance.c | 34 +-- trunk/drivers/net/ucc_geth.c | 2 +- trunk/drivers/net/ucc_geth_mii.h | 2 +- trunk/drivers/s390/net/ctcmain.c | 6 +- trunk/drivers/s390/net/netiucv.c | 4 +- trunk/drivers/serial/suncore.c | 33 +-- trunk/drivers/serial/suncore.h | 3 +- trunk/drivers/serial/sunhv.c | 14 +- trunk/drivers/serial/sunsab.c | 16 +- trunk/drivers/serial/sunsu.c | 16 +- trunk/drivers/serial/sunzilog.c | 41 +-- trunk/include/media/videobuf-core.h | 2 - trunk/net/8021q/vlan.c | 2 +- trunk/net/core/dev.c | 6 +- trunk/net/ipv4/devinet.c | 3 +- trunk/net/ipv4/esp4.c | 5 - trunk/net/ipv6/esp6.c | 6 - trunk/net/ipv6/xfrm6_policy.c | 2 +- trunk/net/xfrm/xfrm_policy.c | 9 +- 68 files changed, 390 insertions(+), 482 deletions(-) diff --git a/[refs] b/[refs] index 1de1b4b2f546..abde256f3f5b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 961994a0c2a24d9622eea7144b30ac773169659f +refs/heads/master: 74cda169fe65ca1dedad6d4a905b13c6ccd87351 diff --git a/trunk/Documentation/i2c/summary b/trunk/Documentation/i2c/summary index 13ab076dcd92..003c7319b8c7 100644 --- a/trunk/Documentation/i2c/summary +++ b/trunk/Documentation/i2c/summary @@ -1,3 +1,5 @@ +This is an explanation of what i2c is, and what is supported in this package. + I2C and SMBus ============= @@ -31,17 +33,52 @@ When we talk about I2C, we use the following terms: Client An Algorithm driver contains general code that can be used for a whole class -of I2C adapters. Each specific adapter driver either depends on one algorithm -driver, or includes its own implementation. +of I2C adapters. Each specific adapter driver depends on one algorithm +driver. A Driver driver (yes, this sounds ridiculous, sorry) contains the general code to access some type of device. Each detected device gets its own data in the Client structure. Usually, Driver and Client are more closely integrated than Algorithm and Adapter. -For a given configuration, you will need a driver for your I2C bus, and -drivers for your I2C devices (usually one driver for each device). +For a given configuration, you will need a driver for your I2C bus (usually +a separate Adapter and Algorithm driver), and drivers for your I2C devices +(usually one driver for each device). There are no I2C device drivers +in this package. See the lm_sensors project http://www.lm-sensors.nu +for device drivers. At this time, Linux only operates I2C (or SMBus) in master mode; you can't use these APIs to make a Linux system behave as a slave/device, either to speak a custom protocol or to emulate some other device. + + +Included Bus Drivers +==================== +Note that only stable drivers are patched into the kernel by 'mkpatch'. + + +Base modules +------------ + +i2c-core: The basic I2C code, including the /proc/bus/i2c* interface +i2c-dev: The /dev/i2c-* interface +i2c-proc: The /proc/sys/dev/sensors interface for device (client) drivers + +Algorithm drivers +----------------- + +i2c-algo-bit: A bit-banging algorithm +i2c-algo-pcf: A PCF 8584 style algorithm +i2c-algo-ibm_ocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT) + +Adapter drivers +--------------- + +i2c-elektor: Elektor ISA card (uses i2c-algo-pcf) +i2c-elv: ELV parallel port adapter (uses i2c-algo-bit) +i2c-pcf-epp: PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (NOT mkpatched) +i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit) +i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT) +i2c-pport: Primitive parallel port adapter (uses i2c-algo-bit) +i2c-velleman: Velleman K8000 parallel port adapter (uses i2c-algo-bit) + diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index 9507b4207512..c331ba391e10 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -2489,6 +2489,12 @@ M: mtk.manpages@gmail.com W: ftp://ftp.kernel.org/pub/linux/docs/manpages S: Maintained +MARVELL LIBERTAS WIRELESS DRIVER +P: Dan Williams +M: dcbw@redhat.com +L: libertas-dev@lists.infradead.org +S: Maintained + MARVELL MV643XX ETHERNET DRIVER P: Dale Farnsworth M: dale@farnsworth.org diff --git a/trunk/arch/sparc64/kernel/smp.c b/trunk/arch/sparc64/kernel/smp.c index c39944927f1a..894b506f9636 100644 --- a/trunk/arch/sparc64/kernel/smp.c +++ b/trunk/arch/sparc64/kernel/smp.c @@ -476,7 +476,7 @@ static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpuma */ static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) { - u64 pstate, ver, busy_mask; + u64 pstate, ver; int nack_busy_id, is_jbus, need_more; if (cpus_empty(mask)) @@ -508,20 +508,14 @@ static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mas "i" (ASI_INTR_W)); nack_busy_id = 0; - busy_mask = 0; { int i; for_each_cpu_mask(i, mask) { u64 target = (i << 14) | 0x70; - if (is_jbus) { - busy_mask |= (0x1UL << (i * 2)); - } else { + if (!is_jbus) target |= (nack_busy_id << 24); - busy_mask |= (0x1UL << - (nack_busy_id * 2)); - } __asm__ __volatile__( "stxa %%g0, [%0] %1\n\t" "membar #Sync\n\t" @@ -537,16 +531,15 @@ static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mas /* Now, poll for completion. */ { - u64 dispatch_stat, nack_mask; + u64 dispatch_stat; long stuck; stuck = 100000 * nack_busy_id; - nack_mask = busy_mask << 1; do { __asm__ __volatile__("ldxa [%%g0] %1, %0" : "=r" (dispatch_stat) : "i" (ASI_INTR_DISPATCH_STAT)); - if (!(dispatch_stat & (busy_mask | nack_mask))) { + if (dispatch_stat == 0UL) { __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); if (unlikely(need_more)) { @@ -563,12 +556,12 @@ static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mas } if (!--stuck) break; - } while (dispatch_stat & busy_mask); + } while (dispatch_stat & 0x5555555555555555UL); __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); - if (dispatch_stat & busy_mask) { + if ((dispatch_stat & ~(0x5555555555555555UL)) == 0) { /* Busy bits will not clear, continue instead * of freezing up on this cpu. */ diff --git a/trunk/arch/um/drivers/net_kern.c b/trunk/arch/um/drivers/net_kern.c index 3c6c44ca1ffa..73681f14f9fc 100644 --- a/trunk/arch/um/drivers/net_kern.c +++ b/trunk/arch/um/drivers/net_kern.c @@ -98,10 +98,10 @@ static int uml_net_rx(struct net_device *dev) if (pkt_len > 0) { skb_trim(skb, pkt_len); skb->protocol = (*lp->protocol)(skb); + netif_rx(skb); lp->stats.rx_bytes += skb->len; lp->stats.rx_packets++; - netif_rx(skb); return pkt_len; } diff --git a/trunk/arch/xtensa/platform-iss/network.c b/trunk/arch/xtensa/platform-iss/network.c index f21b9b0899a8..b61fb36674e7 100644 --- a/trunk/arch/xtensa/platform-iss/network.c +++ b/trunk/arch/xtensa/platform-iss/network.c @@ -393,11 +393,11 @@ static int iss_net_rx(struct net_device *dev) if (pkt_len > 0) { skb_trim(skb, pkt_len); skb->protocol = lp->tp.protocol(skb); + // netif_rx(skb); + netif_rx_ni(skb); lp->stats.rx_bytes += skb->len; lp->stats.rx_packets++; - // netif_rx(skb); - netif_rx_ni(skb); return pkt_len; } kfree_skb(skb); diff --git a/trunk/drivers/i2c/busses/i2c-davinci.c b/trunk/drivers/i2c/busses/i2c-davinci.c index 67679882ebef..bd7aaff35240 100644 --- a/trunk/drivers/i2c/busses/i2c-davinci.c +++ b/trunk/drivers/i2c/busses/i2c-davinci.c @@ -404,7 +404,7 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) DAVINCI_I2C_STR_REG, w); } else - dev_err(dev->dev, "RDR IRQ while no " + dev_err(dev->dev, "RDR IRQ while no" "data requested\n"); break; @@ -423,7 +423,7 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) DAVINCI_I2C_IMR_REG, w); } else - dev_err(dev->dev, "TDR IRQ while no data to " + dev_err(dev->dev, "TDR IRQ while no data to" "send\n"); break; diff --git a/trunk/drivers/i2c/busses/i2c-gpio.c b/trunk/drivers/i2c/busses/i2c-gpio.c index 3ca19fc234fb..44e1cd21bb01 100644 --- a/trunk/drivers/i2c/busses/i2c-gpio.c +++ b/trunk/drivers/i2c/busses/i2c-gpio.c @@ -140,7 +140,6 @@ static int __init i2c_gpio_probe(struct platform_device *pdev) adap->owner = THIS_MODULE; snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); adap->algo_data = bit_data; - adap->class = I2C_CLASS_HWMON; adap->dev.parent = &pdev->dev; /* diff --git a/trunk/drivers/i2c/busses/i2c-omap.c b/trunk/drivers/i2c/busses/i2c-omap.c index cb55cf2ba1e9..89a30028ddb6 100644 --- a/trunk/drivers/i2c/busses/i2c-omap.c +++ b/trunk/drivers/i2c/busses/i2c-omap.c @@ -203,7 +203,7 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) while (!(omap_i2c_read_reg(dev, OMAP_I2C_SYSS_REG) & OMAP_I2C_SYSS_RDONE)) { if (time_after(jiffies, timeout)) { - dev_warn(dev->dev, "timeout waiting " + dev_warn(dev->dev, "timeout waiting" "for controller reset\n"); return -ETIMEDOUT; } @@ -483,7 +483,7 @@ omap_i2c_isr(int this_irq, void *dev_id) dev->buf_len--; } } else - dev_err(dev->dev, "RRDY IRQ while no data " + dev_err(dev->dev, "RRDY IRQ while no data" "requested\n"); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RRDY); continue; @@ -498,7 +498,7 @@ omap_i2c_isr(int this_irq, void *dev_id) dev->buf_len--; } } else - dev_err(dev->dev, "XRDY IRQ while no " + dev_err(dev->dev, "XRDY IRQ while no" "data to send\n"); omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); diff --git a/trunk/drivers/i2c/chips/isp1301_omap.c b/trunk/drivers/i2c/chips/isp1301_omap.c index b767603a07ba..fe04e46991aa 100644 --- a/trunk/drivers/i2c/chips/isp1301_omap.c +++ b/trunk/drivers/i2c/chips/isp1301_omap.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/trunk/drivers/media/common/saa7146_video.c b/trunk/drivers/media/common/saa7146_video.c index ae36d101006b..f245a3b2ef47 100644 --- a/trunk/drivers/media/common/saa7146_video.c +++ b/trunk/drivers/media/common/saa7146_video.c @@ -1205,10 +1205,13 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int DEB_D(("VIDIOCGMBUF \n")); q = &fh->video_q; + mutex_lock(&q->lock); err = videobuf_mmap_setup(q,gbuffers,gbufsize, V4L2_MEMORY_MMAP); - if (err < 0) + if (err < 0) { + mutex_unlock(&q->lock); return err; + } gbuffers = err; memset(mbuf,0,sizeof(*mbuf)); @@ -1216,6 +1219,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int mbuf->size = gbuffers * gbufsize; for (i = 0; i < gbuffers; i++) mbuf->offsets[i] = i * gbufsize; + mutex_unlock(&q->lock); return 0; } #endif @@ -1436,7 +1440,10 @@ static void video_close(struct saa7146_dev *dev, struct file *file) err = saa7146_stop_preview(fh); } - videobuf_stop(q); + // release all capture buffers + mutex_lock(&q->lock); + videobuf_read_stop(q); + mutex_unlock(&q->lock); /* hmm, why is this function declared void? */ /* return err */ diff --git a/trunk/drivers/media/dvb/dvb-usb/Makefile b/trunk/drivers/media/dvb/dvb-usb/Makefile index 60a910052c16..73ac0a93fdeb 100644 --- a/trunk/drivers/media/dvb/dvb-usb/Makefile +++ b/trunk/drivers/media/dvb/dvb-usb/Makefile @@ -62,6 +62,3 @@ dvb-usb-af9005-remote-objs = af9005-remote.o obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ -# due to tuner-xc3028 -EXTRA_CFLAGS += -Idrivers/media/video - diff --git a/trunk/drivers/media/dvb/dvb-usb/dibusb-common.c b/trunk/drivers/media/dvb/dvb-usb/dibusb-common.c index 8ee6cd4da9e7..9a184da01c47 100644 --- a/trunk/drivers/media/dvb/dvb-usb/dibusb-common.c +++ b/trunk/drivers/media/dvb/dvb-usb/dibusb-common.c @@ -223,9 +223,6 @@ static struct dibx000_agc_config dib3000p_panasonic_agc_config = { .agc2_slope2 = 0x1e, }; -#if defined(CONFIG_DVB_DIB3000MC) || \ - (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE)) - static struct dib3000mc_config mod3000p_dib3000p_config = { &dib3000p_panasonic_agc_config, @@ -308,7 +305,6 @@ int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap) return 0; } EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach); -#endif /* * common remote control stuff diff --git a/trunk/drivers/media/dvb/frontends/tda10086.c b/trunk/drivers/media/dvb/frontends/tda10086.c index 9d26ace65151..9a8ddc537f8f 100644 --- a/trunk/drivers/media/dvb/frontends/tda10086.c +++ b/trunk/drivers/media/dvb/frontends/tda10086.c @@ -158,7 +158,7 @@ static int tda10086_init(struct dvb_frontend* fe) tda10086_write_byte(state, 0x3d, 0x80); // setup SEC - tda10086_write_byte(state, 0x36, 0x80); // all SEC off, no 22k tone + tda10086_write_byte(state, 0x36, 0x00); // all SEC off tda10086_write_byte(state, 0x34, (((1<<19) * (22000/1000)) / (SACLK/1000))); // } tone frequency tda10086_write_byte(state, 0x35, (((1<<19) * (22000/1000)) / (SACLK/1000)) >> 8); // } @@ -183,13 +183,13 @@ static int tda10086_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone) dprintk ("%s\n", __FUNCTION__); - switch (tone) { + switch(tone) { case SEC_TONE_OFF: - tda10086_write_byte(state, 0x36, 0x80); + tda10086_write_byte(state, 0x36, 0x00); break; case SEC_TONE_ON: - tda10086_write_byte(state, 0x36, 0x81); + tda10086_write_byte(state, 0x36, 0x01); break; } @@ -212,7 +212,7 @@ static int tda10086_send_master_cmd (struct dvb_frontend* fe, for(i=0; i< cmd->msg_len; i++) { tda10086_write_byte(state, 0x48+i, cmd->msg[i]); } - tda10086_write_byte(state, 0x36, 0x88 | ((cmd->msg_len - 1) << 4)); + tda10086_write_byte(state, 0x36, 0x08 | ((cmd->msg_len - 1) << 4)); tda10086_diseqc_wait(state); @@ -230,11 +230,11 @@ static int tda10086_send_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t minic switch(minicmd) { case SEC_MINI_A: - tda10086_write_byte(state, 0x36, 0x84); + tda10086_write_byte(state, 0x36, 0x04); break; case SEC_MINI_B: - tda10086_write_byte(state, 0x36, 0x86); + tda10086_write_byte(state, 0x36, 0x06); break; } diff --git a/trunk/drivers/media/dvb/frontends/zl10353.c b/trunk/drivers/media/dvb/frontends/zl10353.c index 0106df4c55e8..a97a7fd2c891 100644 --- a/trunk/drivers/media/dvb/frontends/zl10353.c +++ b/trunk/drivers/media/dvb/frontends/zl10353.c @@ -122,7 +122,7 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe, enum fe_bandwidth bandwidth, u16 *nominal_rate) { - u32 adc_clock = 45056; /* 45.056 MHz */ + u32 adc_clock = 22528; /* 20.480 MHz on the board(!?) */ u8 bw; struct zl10353_state *state = fe->demodulator_priv; @@ -142,7 +142,7 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe, break; } - *nominal_rate = (bw * (1 << 23) / 7 * 125 + adc_clock / 2) / adc_clock; + *nominal_rate = (64 * bw * (1<<16) / (7 * 8) * 4000 / adc_clock + 2) / 4; dprintk("%s: bw %d, adc_clock %d => 0x%x\n", __FUNCTION__, bw, adc_clock, *nominal_rate); diff --git a/trunk/drivers/media/dvb/frontends/zl10353.h b/trunk/drivers/media/dvb/frontends/zl10353.h index 1c3d494a6da9..cb274dc12b82 100644 --- a/trunk/drivers/media/dvb/frontends/zl10353.h +++ b/trunk/drivers/media/dvb/frontends/zl10353.h @@ -30,7 +30,7 @@ struct zl10353_config u8 demod_address; /* frequencies in kHz */ - int adc_clock; /* default: 45056 */ + int adc_clock; // default: 22528 /* set if no pll is connected to the secondary i2c bus */ int no_tuner; diff --git a/trunk/drivers/media/video/bt8xx/bttv-cards.c b/trunk/drivers/media/video/bt8xx/bttv-cards.c index 585d1ef95afd..3abd9fa54d2c 100644 --- a/trunk/drivers/media/video/bt8xx/bttv-cards.c +++ b/trunk/drivers/media/video/bt8xx/bttv-cards.c @@ -5080,7 +5080,7 @@ static void PXC200_muxsel(struct bttv *btv, unsigned int input) /* ----------------------------------------------------------------------- */ /* motherboard chipset specific stuff */ -void __init bttv_check_chipset(void) +void __devinit bttv_check_chipset(void) { int pcipci_fail = 0; struct pci_dev *dev = NULL; diff --git a/trunk/drivers/media/video/bt8xx/bttv-driver.c b/trunk/drivers/media/video/bt8xx/bttv-driver.c index c02d92deacd2..a88b56e6ca05 100644 --- a/trunk/drivers/media/video/bt8xx/bttv-driver.c +++ b/trunk/drivers/media/video/bt8xx/bttv-driver.c @@ -3827,7 +3827,10 @@ static int bttv_release(struct inode *inode, struct file *file) /* stop vbi capture */ if (check_btres(fh, RESOURCE_VBI)) { - videobuf_stop(&fh->vbi); + if (fh->vbi.streaming) + videobuf_streamoff(&fh->vbi); + if (fh->vbi.reading) + videobuf_read_stop(&fh->vbi); free_btres(btv,fh,RESOURCE_VBI); } @@ -4985,7 +4988,7 @@ static struct pci_driver bttv_pci_driver = { #endif }; -static int __init bttv_init_module(void) +static int bttv_init_module(void) { int ret; @@ -5018,7 +5021,7 @@ static int __init bttv_init_module(void) return pci_register_driver(&bttv_pci_driver); } -static void __exit bttv_cleanup_module(void) +static void bttv_cleanup_module(void) { pci_unregister_driver(&bttv_pci_driver); bus_unregister(&bttv_sub_bus_type); diff --git a/trunk/drivers/media/video/cx88/cx88-blackbird.c b/trunk/drivers/media/video/cx88/cx88-blackbird.c index f802b5653569..f33f0b47142c 100644 --- a/trunk/drivers/media/video/cx88/cx88-blackbird.c +++ b/trunk/drivers/media/video/cx88/cx88-blackbird.c @@ -1085,7 +1085,10 @@ static int mpeg_release(struct inode *inode, struct file *file) cx8802_cancel_buffers(fh->dev); /* stop mpeg capture */ - videobuf_stop(&fh->mpegq); + if (fh->mpegq.streaming) + videobuf_streamoff(&fh->mpegq); + if (fh->mpegq.reading) + videobuf_read_stop(&fh->mpegq); videobuf_mmap_free(&fh->mpegq); file->private_data = NULL; diff --git a/trunk/drivers/media/video/cx88/cx88-video.c b/trunk/drivers/media/video/cx88/cx88-video.c index c84dafbdb991..5ee05f8f3fad 100644 --- a/trunk/drivers/media/video/cx88/cx88-video.c +++ b/trunk/drivers/media/video/cx88/cx88-video.c @@ -851,7 +851,10 @@ static int video_release(struct inode *inode, struct file *file) /* stop vbi capture */ if (res_check(fh, RESOURCE_VBI)) { - videobuf_stop(&fh->vbiq); + if (fh->vbiq.streaming) + videobuf_streamoff(&fh->vbiq); + if (fh->vbiq.reading) + videobuf_read_stop(&fh->vbiq); res_free(dev,fh,RESOURCE_VBI); } diff --git a/trunk/drivers/media/video/em28xx/em28xx-video.c b/trunk/drivers/media/video/em28xx/em28xx-video.c index 0906bc5766cc..2529c298b862 100644 --- a/trunk/drivers/media/video/em28xx/em28xx-video.c +++ b/trunk/drivers/media/video/em28xx/em28xx-video.c @@ -144,8 +144,7 @@ static int em28xx_config(struct em28xx *dev) { /* Sets I2C speed to 100 KHz */ - if (!dev->is_em2800) - em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); + em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); /* enable vbi capturing */ @@ -571,9 +570,7 @@ static void em28xx_vm_close(struct vm_area_struct *vma) { /* NOTE: buffers are not freed here */ struct em28xx_frame_t *f = vma->vm_private_data; - - if (f->vma_use_count) - f->vma_use_count--; + f->vma_use_count--; } static struct vm_operations_struct em28xx_vm_ops = { diff --git a/trunk/drivers/media/video/ivtv/ivtv-i2c.c b/trunk/drivers/media/video/ivtv/ivtv-i2c.c index 77b27dc750b1..623eea2652ca 100644 --- a/trunk/drivers/media/video/ivtv/ivtv-i2c.c +++ b/trunk/drivers/media/video/ivtv/ivtv-i2c.c @@ -706,7 +706,7 @@ void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg) } /* init + register i2c algo-bit adapter */ -int init_ivtv_i2c(struct ivtv *itv) +int __devinit init_ivtv_i2c(struct ivtv *itv) { IVTV_DEBUG_I2C("i2c init\n"); diff --git a/trunk/drivers/media/video/ivtv/ivtv-i2c.h b/trunk/drivers/media/video/ivtv/ivtv-i2c.h index 987042c09b64..de6a07442298 100644 --- a/trunk/drivers/media/video/ivtv/ivtv-i2c.h +++ b/trunk/drivers/media/video/ivtv/ivtv-i2c.h @@ -35,7 +35,7 @@ int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg); /* init + register i2c algo-bit adapter */ -int init_ivtv_i2c(struct ivtv *itv); +int __devinit init_ivtv_i2c(struct ivtv *itv); void exit_ivtv_i2c(struct ivtv *itv); #endif diff --git a/trunk/drivers/media/video/ivtv/ivtv-streams.c b/trunk/drivers/media/video/ivtv/ivtv-streams.c index 74fb0e021979..aa03e61ef310 100644 --- a/trunk/drivers/media/video/ivtv/ivtv-streams.c +++ b/trunk/drivers/media/video/ivtv/ivtv-streams.c @@ -76,7 +76,7 @@ static struct { int minor_offset; int dma, pio; enum v4l2_buf_type buf_type; - const struct file_operations *fops; + struct file_operations *fops; } ivtv_stream_info[] = { { /* IVTV_ENC_STREAM_TYPE_MPG */ "encoder MPG", diff --git a/trunk/drivers/media/video/saa5246a.c b/trunk/drivers/media/video/saa5246a.c index 996b49491f5a..ad0232935df6 100644 --- a/trunk/drivers/media/video/saa5246a.c +++ b/trunk/drivers/media/video/saa5246a.c @@ -187,14 +187,12 @@ static int i2c_senddata(struct saa5246a_device *t, ...) { unsigned char buf[64]; int v; - int ct = 0; + int ct=0; va_list argp; - va_start(argp, t); + va_start(argp,t); - while ((v = va_arg(argp, int)) != -1) - buf[ct++] = v; - - va_end(argp); + while((v=va_arg(argp,int))!=-1) + buf[ct++]=v; return i2c_sendbuf(t, buf[0], ct-1, buf+1); } diff --git a/trunk/drivers/media/video/saa5249.c b/trunk/drivers/media/video/saa5249.c index f55d6e85f20f..94bb59a32b17 100644 --- a/trunk/drivers/media/video/saa5249.c +++ b/trunk/drivers/media/video/saa5249.c @@ -282,14 +282,12 @@ static int i2c_senddata(struct saa5249_device *t, ...) { unsigned char buf[64]; int v; - int ct = 0; + int ct=0; va_list argp; va_start(argp,t); - while ((v = va_arg(argp, int)) != -1) - buf[ct++] = v; - - va_end(argp); + while((v=va_arg(argp,int))!=-1) + buf[ct++]=v; return i2c_sendbuf(t, buf[0], ct-1, buf+1); } diff --git a/trunk/drivers/media/video/saa7134/saa7134-alsa.c b/trunk/drivers/media/video/saa7134/saa7134-alsa.c index 4878f3067787..b9c5cf7dc849 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-alsa.c +++ b/trunk/drivers/media/video/saa7134/saa7134-alsa.c @@ -222,8 +222,7 @@ static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id) if (report & SAA7134_IRQ_REPORT_DONE_RA3) { handled = 1; - saa_writel(SAA7134_IRQ_REPORT, - SAA7134_IRQ_REPORT_DONE_RA3); + saa_writel(SAA7134_IRQ_REPORT,report); saa7134_irq_alsa_done(dev, status); } else { goto out; @@ -458,7 +457,7 @@ static struct snd_pcm_hardware snd_card_saa7134_capture = .buffer_bytes_max = (256*1024), .period_bytes_min = 64, .period_bytes_max = (256*1024), - .periods_min = 4, + .periods_min = 2, .periods_max = 1024, }; @@ -492,7 +491,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, snd_assert(period_size >= 0x100 && period_size <= 0x10000, return -EINVAL); - snd_assert(periods >= 4, return -EINVAL); + snd_assert(periods >= 2, return -EINVAL); snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL); dev = saa7134->dev; @@ -648,14 +647,7 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) saa7134_tvaudio_setmute(dev); } - err = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (err < 0) - return err; - - err = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIODS, 2); - if (err < 0) + if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) return err; return 0; diff --git a/trunk/drivers/media/video/saa7134/saa7134-cards.c b/trunk/drivers/media/video/saa7134/saa7134-cards.c index c6eb1e37a46e..4f3dad9ae6d6 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-cards.c +++ b/trunk/drivers/media/video/saa7134/saa7134-cards.c @@ -334,7 +334,7 @@ struct saa7134_board saa7134_boards[] = { .tv = 1, },{ .name = name_comp1, - .vmux = 0, + .vmux = 2, .amux = LINE1, },{ .name = name_comp2, diff --git a/trunk/drivers/media/video/saa7134/saa7134-core.c b/trunk/drivers/media/video/saa7134/saa7134-core.c index 4fd187ac9d70..a499eea379e6 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-core.c +++ b/trunk/drivers/media/video/saa7134/saa7134-core.c @@ -569,22 +569,21 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id) for (loop = 0; loop < 10; loop++) { report = saa_readl(SAA7134_IRQ_REPORT); status = saa_readl(SAA7134_IRQ_STATUS); - - /* If dmasound support is active and we get a sound report, - * mask out the report and let the saa7134-alsa module deal - * with it */ - if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && - (dev->dmasound.priv_data != NULL) ) - { + if (0 == report) { if (irq_debug > 1) - printk(KERN_DEBUG "%s/irq: preserving DMA sound interrupt\n", + printk(KERN_DEBUG "%s/irq: no (more) work\n", dev->name); - report &= ~SAA7134_IRQ_REPORT_DONE_RA3; + goto out; } - if (0 == report) { + /* If dmasound support is active and we get a sound report, exit + and let the saa7134-alsa/oss module deal with it */ + + if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && + (dev->dmasound.priv_data != NULL) ) + { if (irq_debug > 1) - printk(KERN_DEBUG "%s/irq: no (more) work\n", + printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n", dev->name); goto out; } diff --git a/trunk/drivers/media/video/saa7134/saa7134-dvb.c b/trunk/drivers/media/video/saa7134/saa7134-dvb.c index e1ab099ec4c6..38d87332cc5d 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-dvb.c +++ b/trunk/drivers/media/video/saa7134/saa7134-dvb.c @@ -662,7 +662,6 @@ static struct tda1004x_config hauppauge_hvr_1110_config = { .if_freq = TDA10046_FREQ_045, .i2c_gate = 0x4b, .tuner_address = 0x61, - .tuner_config = 1, .request_firmware = philips_tda1004x_request_firmware }; diff --git a/trunk/drivers/media/video/saa7134/saa7134-empress.c b/trunk/drivers/media/video/saa7134/saa7134-empress.c index 9322f44865b8..75d0c5bf46d2 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-empress.c +++ b/trunk/drivers/media/video/saa7134/saa7134-empress.c @@ -110,8 +110,11 @@ static int ts_release(struct inode *inode, struct file *file) { struct saa7134_dev *dev = file->private_data; + if (dev->empress_tsq.streaming) + videobuf_streamoff(&dev->empress_tsq); mutex_lock(&dev->empress_tsq.lock); - videobuf_stop(&dev->empress_tsq); + if (dev->empress_tsq.reading) + videobuf_read_stop(&dev->empress_tsq); videobuf_mmap_free(&dev->empress_tsq); dev->empress_users--; diff --git a/trunk/drivers/media/video/saa7134/saa7134-video.c b/trunk/drivers/media/video/saa7134/saa7134-video.c index 6396d9b5c063..3b9ffb4b648a 100644 --- a/trunk/drivers/media/video/saa7134/saa7134-video.c +++ b/trunk/drivers/media/video/saa7134/saa7134-video.c @@ -1445,7 +1445,10 @@ static int video_release(struct inode *inode, struct file *file) /* stop vbi capture */ if (res_check(fh, RESOURCE_VBI)) { - videobuf_stop(&fh->vbi); + if (fh->vbi.streaming) + videobuf_streamoff(&fh->vbi); + if (fh->vbi.reading) + videobuf_read_stop(&fh->vbi); res_free(dev,fh,RESOURCE_VBI); } diff --git a/trunk/drivers/media/video/tvp5150.c b/trunk/drivers/media/video/tvp5150.c index 445eba4174d7..25d0aef88ef5 100644 --- a/trunk/drivers/media/video/tvp5150.c +++ b/trunk/drivers/media/video/tvp5150.c @@ -290,7 +290,6 @@ static inline void tvp5150_selmux(struct i2c_client *c) int opmode=0; struct tvp5150 *decoder = i2c_get_clientdata(c); int input = 0; - unsigned char val; if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable) input = 8; @@ -316,16 +315,6 @@ static inline void tvp5150_selmux(struct i2c_client *c) tvp5150_write(c, TVP5150_OP_MODE_CTL, opmode); tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input); - - /* Svideo should enable YCrCb output and disable GPCL output - * For Composite and TV, it should be the reverse - */ - val = tvp5150_read(c, TVP5150_MISC_CTL); - if (decoder->route.input == TVP5150_SVIDEO) - val = (val & ~0x40) | 0x10; - else - val = (val & ~0x10) | 0x40; - tvp5150_write(c, TVP5150_MISC_CTL, val); }; struct i2c_reg_value { diff --git a/trunk/drivers/media/video/videobuf-core.c b/trunk/drivers/media/video/videobuf-core.c index 81f77d2b4bd3..89a44f16f0ba 100644 --- a/trunk/drivers/media/video/videobuf-core.c +++ b/trunk/drivers/media/video/videobuf-core.c @@ -141,7 +141,6 @@ void videobuf_queue_core_init(struct videobuf_queue* q, INIT_LIST_HEAD(&q->stream); } -/* Locking: Only usage in bttv unsafe find way to remove */ int videobuf_queue_is_busy(struct videobuf_queue *q) { int i; @@ -179,7 +178,6 @@ int videobuf_queue_is_busy(struct videobuf_queue *q) return 0; } -/* Locking: Caller holds q->lock */ void videobuf_queue_cancel(struct videobuf_queue *q) { unsigned long flags=0; @@ -210,7 +208,6 @@ void videobuf_queue_cancel(struct videobuf_queue *q) /* --------------------------------------------------------------------- */ -/* Locking: Caller holds q->lock */ enum v4l2_field videobuf_next_field(struct videobuf_queue *q) { enum v4l2_field field = q->field; @@ -229,7 +226,6 @@ enum v4l2_field videobuf_next_field(struct videobuf_queue *q) return field; } -/* Locking: Caller holds q->lock */ static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b, struct videobuf_buffer *vb, enum v4l2_buf_type type) { @@ -285,108 +281,20 @@ static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b, b->sequence = vb->field_count >> 1; } -/* Locking: Caller holds q->lock */ -static int __videobuf_mmap_free(struct videobuf_queue *q) -{ - int i; - int rc; - - if (!q) - return 0; - - MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS); - - rc = CALL(q,mmap_free,q); - if (rc<0) - return rc; - - for (i = 0; i < VIDEO_MAX_FRAME; i++) { - if (NULL == q->bufs[i]) - continue; - q->ops->buf_release(q,q->bufs[i]); - kfree(q->bufs[i]); - q->bufs[i] = NULL; - } - - return rc; -} - -int videobuf_mmap_free(struct videobuf_queue *q) -{ - int ret; - mutex_lock(&q->lock); - ret = __videobuf_mmap_free(q); - mutex_unlock(&q->lock); - return ret; -} - -/* Locking: Caller holds q->lock */ -static int __videobuf_mmap_setup(struct videobuf_queue *q, - unsigned int bcount, unsigned int bsize, - enum v4l2_memory memory) -{ - unsigned int i; - int err; - - MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS); - - err = __videobuf_mmap_free(q); - if (0 != err) - return err; - - /* Allocate and initialize buffers */ - for (i = 0; i < bcount; i++) { - q->bufs[i] = videobuf_alloc(q); - - if (q->bufs[i] == NULL) - break; - - q->bufs[i]->i = i; - q->bufs[i]->input = UNSET; - q->bufs[i]->memory = memory; - q->bufs[i]->bsize = bsize; - switch (memory) { - case V4L2_MEMORY_MMAP: - q->bufs[i]->boff = bsize * i; - break; - case V4L2_MEMORY_USERPTR: - case V4L2_MEMORY_OVERLAY: - /* nothing */ - break; - } - } - - if (!i) - return -ENOMEM; - - dprintk(1,"mmap setup: %d buffers, %d bytes each\n", - i, bsize); - - return i; -} - -int videobuf_mmap_setup(struct videobuf_queue *q, - unsigned int bcount, unsigned int bsize, - enum v4l2_memory memory) -{ - int ret; - mutex_lock(&q->lock); - ret = __videobuf_mmap_setup(q, bcount, bsize, memory); - mutex_unlock(&q->lock); - return ret; -} - int videobuf_reqbufs(struct videobuf_queue *q, struct v4l2_requestbuffers *req) { unsigned int size,count; int retval; + if (req->type != q->type) { + dprintk(1,"reqbufs: queue type invalid\n"); + return -EINVAL; + } if (req->count < 1) { dprintk(1,"reqbufs: count invalid (%d)\n",req->count); return -EINVAL; } - if (req->memory != V4L2_MEMORY_MMAP && req->memory != V4L2_MEMORY_USERPTR && req->memory != V4L2_MEMORY_OVERLAY) { @@ -395,12 +303,6 @@ int videobuf_reqbufs(struct videobuf_queue *q, } mutex_lock(&q->lock); - if (req->type != q->type) { - dprintk(1,"reqbufs: queue type invalid\n"); - retval = -EINVAL; - goto done; - } - if (q->streaming) { dprintk(1,"reqbufs: streaming already exists\n"); retval = -EBUSY; @@ -421,7 +323,7 @@ int videobuf_reqbufs(struct videobuf_queue *q, dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n", count, size, (count*size)>>PAGE_SHIFT); - retval = __videobuf_mmap_setup(q,count,size,req->memory); + retval = videobuf_mmap_setup(q,count,size,req->memory); if (retval < 0) { dprintk(1,"reqbufs: mmap setup returned %d\n",retval); goto done; @@ -436,28 +338,20 @@ int videobuf_reqbufs(struct videobuf_queue *q, int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b) { - int ret = -EINVAL; - - mutex_lock(&q->lock); if (unlikely(b->type != q->type)) { dprintk(1,"querybuf: Wrong type.\n"); - goto done; + return -EINVAL; } if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) { dprintk(1,"querybuf: index out of range.\n"); - goto done; + return -EINVAL; } if (unlikely(NULL == q->bufs[b->index])) { dprintk(1,"querybuf: buffer is null.\n"); - goto done; + return -EINVAL; } - videobuf_status(q,b,q->bufs[b->index],q->type); - - ret = 0; -done: - mutex_unlock(&q->lock); - return ret; + return 0; } int videobuf_qbuf(struct videobuf_queue *q, @@ -647,30 +541,22 @@ int videobuf_streamon(struct videobuf_queue *q) return retval; } -/* Locking: Caller holds q->lock */ -static int __videobuf_streamoff(struct videobuf_queue *q) +int videobuf_streamoff(struct videobuf_queue *q) { - if (!q->streaming) - return -EINVAL; + int retval = -EINVAL; + mutex_lock(&q->lock); + if (!q->streaming) + goto done; videobuf_queue_cancel(q); q->streaming = 0; + retval = 0; - return 0; -} - -int videobuf_streamoff(struct videobuf_queue *q) -{ - int retval; - - mutex_lock(&q->lock); - retval = __videobuf_streamoff(q); + done: mutex_unlock(&q->lock); - return retval; } -/* Locking: Caller holds q->lock */ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data, size_t count, loff_t *ppos) @@ -805,8 +691,7 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, return retval; } -/* Locking: Caller holds q->lock */ -int __videobuf_read_start(struct videobuf_queue *q) +int videobuf_read_start(struct videobuf_queue *q) { enum v4l2_field field; unsigned long flags=0; @@ -820,7 +705,7 @@ int __videobuf_read_start(struct videobuf_queue *q) count = VIDEO_MAX_FRAME; size = PAGE_ALIGN(size); - err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR); + err = videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR); if (err < 0) return err; @@ -843,13 +728,12 @@ int __videobuf_read_start(struct videobuf_queue *q) return 0; } -static void __videobuf_read_stop(struct videobuf_queue *q) +void videobuf_read_stop(struct videobuf_queue *q) { int i; - videobuf_queue_cancel(q); - __videobuf_mmap_free(q); + videobuf_mmap_free(q); INIT_LIST_HEAD(&q->stream); for (i = 0; i < VIDEO_MAX_FRAME; i++) { if (NULL == q->bufs[i]) @@ -859,41 +743,8 @@ static void __videobuf_read_stop(struct videobuf_queue *q) } q->read_buf = NULL; q->reading = 0; - } -int videobuf_read_start(struct videobuf_queue *q) -{ - int rc; - - mutex_lock(&q->lock); - rc = __videobuf_read_start(q); - mutex_unlock(&q->lock); - - return rc; -} - -void videobuf_read_stop(struct videobuf_queue *q) -{ - mutex_lock(&q->lock); - __videobuf_read_stop(q); - mutex_unlock(&q->lock); -} - -void videobuf_stop(struct videobuf_queue *q) -{ - mutex_lock(&q->lock); - - if (q->streaming) - __videobuf_streamoff(q); - - if (q->reading) - __videobuf_read_stop(q); - - mutex_unlock(&q->lock); -} - - ssize_t videobuf_read_stream(struct videobuf_queue *q, char __user *data, size_t count, loff_t *ppos, int vbihack, int nonblocking) @@ -1007,6 +858,75 @@ unsigned int videobuf_poll_stream(struct file *file, return rc; } +int videobuf_mmap_setup(struct videobuf_queue *q, + unsigned int bcount, unsigned int bsize, + enum v4l2_memory memory) +{ + unsigned int i; + int err; + + MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS); + + err = videobuf_mmap_free(q); + if (0 != err) + return err; + + /* Allocate and initialize buffers */ + for (i = 0; i < bcount; i++) { + q->bufs[i] = videobuf_alloc(q); + + if (q->bufs[i] == NULL) + break; + + q->bufs[i]->i = i; + q->bufs[i]->input = UNSET; + q->bufs[i]->memory = memory; + q->bufs[i]->bsize = bsize; + switch (memory) { + case V4L2_MEMORY_MMAP: + q->bufs[i]->boff = bsize * i; + break; + case V4L2_MEMORY_USERPTR: + case V4L2_MEMORY_OVERLAY: + /* nothing */ + break; + } + } + + if (!i) + return -ENOMEM; + + dprintk(1,"mmap setup: %d buffers, %d bytes each\n", + i, bsize); + + return i; +} + +int videobuf_mmap_free(struct videobuf_queue *q) +{ + int i; + int rc; + + if (!q) + return 0; + + MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS); + + rc = CALL(q,mmap_free,q); + if (rc<0) + return rc; + + for (i = 0; i < VIDEO_MAX_FRAME; i++) { + if (NULL == q->bufs[i]) + continue; + q->ops->buf_release(q,q->bufs[i]); + kfree(q->bufs[i]); + q->bufs[i] = NULL; + } + + return rc; +} + int videobuf_mmap_mapper(struct videobuf_queue *q, struct vm_area_struct *vma) { @@ -1071,7 +991,6 @@ EXPORT_SYMBOL_GPL(videobuf_streamoff); EXPORT_SYMBOL_GPL(videobuf_read_start); EXPORT_SYMBOL_GPL(videobuf_read_stop); -EXPORT_SYMBOL_GPL(videobuf_stop); EXPORT_SYMBOL_GPL(videobuf_read_stream); EXPORT_SYMBOL_GPL(videobuf_read_one); EXPORT_SYMBOL_GPL(videobuf_poll_stream); diff --git a/trunk/drivers/media/video/videobuf-vmalloc.c b/trunk/drivers/media/video/videobuf-vmalloc.c index e01259438bb2..cd74341c984f 100644 --- a/trunk/drivers/media/video/videobuf-vmalloc.c +++ b/trunk/drivers/media/video/videobuf-vmalloc.c @@ -51,7 +51,7 @@ videobuf_vm_open(struct vm_area_struct *vma) { struct videobuf_mapping *map = vma->vm_private_data; - dprintk(2,"vm_open %p [count=%u,vma=%08lx-%08lx]\n",map, + dprintk(2,"vm_open %p [count=%d,vma=%08lx-%08lx]\n",map, map->count,vma->vm_start,vma->vm_end); map->count++; @@ -64,7 +64,7 @@ videobuf_vm_close(struct vm_area_struct *vma) struct videobuf_queue *q = map->q; int i; - dprintk(2,"vm_close %p [count=%u,vma=%08lx-%08lx]\n",map, + dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map, map->count,vma->vm_start,vma->vm_end); map->count--; @@ -221,7 +221,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, } /* create mapping + update buffer list */ - map = q->bufs[first]->map = kzalloc(sizeof(struct videobuf_mapping),GFP_KERNEL); + map = q->bufs[first]->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL); if (NULL == map) return -ENOMEM; diff --git a/trunk/drivers/media/video/vivi.c b/trunk/drivers/media/video/vivi.c index 9b54ff9d2e36..ee73dc75131c 100644 --- a/trunk/drivers/media/video/vivi.c +++ b/trunk/drivers/media/video/vivi.c @@ -1076,7 +1076,6 @@ static int vivi_release(struct inode *inode, struct file *file) int minor = iminor(inode); vivi_stop_thread(vidq); - videobuf_stop(&fh->vb_vidq); videobuf_mmap_free(&fh->vb_vidq); kfree (fh); diff --git a/trunk/drivers/net/Kconfig b/trunk/drivers/net/Kconfig index d9107e542dfa..6cde4edc846b 100644 --- a/trunk/drivers/net/Kconfig +++ b/trunk/drivers/net/Kconfig @@ -2588,6 +2588,7 @@ config MLX4_DEBUG config TEHUTI tristate "Tehuti Networks 10G Ethernet" depends on PCI + select ZLIB_INFLATE help Tehuti Networks 10G Ethernet NIC diff --git a/trunk/drivers/net/bnx2.c b/trunk/drivers/net/bnx2.c index 4e7b46e44874..da767d3d5af5 100644 --- a/trunk/drivers/net/bnx2.c +++ b/trunk/drivers/net/bnx2.c @@ -56,8 +56,8 @@ #define DRV_MODULE_NAME "bnx2" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "1.6.9" -#define DRV_MODULE_RELDATE "December 8, 2007" +#define DRV_MODULE_VERSION "1.6.8" +#define DRV_MODULE_RELDATE "October 17, 2007" #define RUN_AT(x) (jiffies + (x)) @@ -2387,24 +2387,18 @@ bnx2_reuse_rx_skb(struct bnx2 *bp, struct sk_buff *skb, prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo; } -static inline u16 -bnx2_get_hw_rx_cons(struct bnx2 *bp) -{ - u16 cons = bp->status_blk->status_rx_quick_consumer_index0; - - if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT)) - cons++; - return cons; -} - static int bnx2_rx_int(struct bnx2 *bp, int budget) { + struct status_block *sblk = bp->status_blk; u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; struct l2_fhdr *rx_hdr; int rx_pkt = 0; - hw_cons = bnx2_get_hw_rx_cons(bp); + hw_cons = bp->hw_rx_cons = sblk->status_rx_quick_consumer_index0; + if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) { + hw_cons++; + } sw_cons = bp->rx_cons; sw_prod = bp->rx_prod; @@ -2521,7 +2515,10 @@ bnx2_rx_int(struct bnx2 *bp, int budget) /* Refresh hw_cons to see if there is new work */ if (sw_cons == hw_cons) { - hw_cons = bnx2_get_hw_rx_cons(bp); + hw_cons = bp->hw_rx_cons = + sblk->status_rx_quick_consumer_index0; + if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) + hw_cons++; rmb(); } } @@ -2625,7 +2622,7 @@ bnx2_has_work(struct bnx2 *bp) { struct status_block *sblk = bp->status_blk; - if ((bnx2_get_hw_rx_cons(bp) != bp->rx_cons) || + if ((sblk->status_rx_quick_consumer_index0 != bp->hw_rx_cons) || (sblk->status_tx_quick_consumer_index0 != bp->hw_tx_cons)) return 1; @@ -2658,7 +2655,7 @@ static int bnx2_poll_work(struct bnx2 *bp, int work_done, int budget) if (sblk->status_tx_quick_consumer_index0 != bp->hw_tx_cons) bnx2_tx_int(bp); - if (bnx2_get_hw_rx_cons(bp) != bp->rx_cons) + if (sblk->status_rx_quick_consumer_index0 != bp->hw_rx_cons) work_done += bnx2_rx_int(bp, budget - work_done); return work_done; @@ -4180,6 +4177,7 @@ bnx2_init_rx_ring(struct bnx2 *bp) ring_prod = prod = bp->rx_prod = 0; bp->rx_cons = 0; + bp->hw_rx_cons = 0; bp->rx_prod_bseq = 0; for (i = 0; i < bp->rx_max_ring; i++) { @@ -6687,9 +6685,8 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) } else if (CHIP_NUM(bp) == CHIP_NUM_5706 || CHIP_NUM(bp) == CHIP_NUM_5708) bp->phy_flags |= PHY_CRC_FIX_FLAG; - else if (CHIP_NUM(bp) == CHIP_NUM_5709 && - (CHIP_REV(bp) == CHIP_REV_Ax || - CHIP_REV(bp) == CHIP_REV_Bx)) + else if (CHIP_ID(bp) == CHIP_ID_5709_A0 || + CHIP_ID(bp) == CHIP_ID_5709_A1) bp->phy_flags |= PHY_DIS_EARLY_DAC_FLAG; if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || diff --git a/trunk/drivers/net/bnx2.h b/trunk/drivers/net/bnx2.h index 30ba366608b0..1dce0d1a2581 100644 --- a/trunk/drivers/net/bnx2.h +++ b/trunk/drivers/net/bnx2.h @@ -6513,6 +6513,7 @@ struct bnx2 { u32 rx_prod_bseq; u16 rx_prod; u16 rx_cons; + u16 hw_rx_cons; u32 rx_csum; diff --git a/trunk/drivers/net/e100.c b/trunk/drivers/net/e100.c index 2b06e4b4dabc..e1c8a0d023ea 100644 --- a/trunk/drivers/net/e100.c +++ b/trunk/drivers/net/e100.c @@ -2737,9 +2737,8 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) pci_enable_wake(pdev, PCI_D3cold, 0); } - free_irq(pdev->irq, netdev); - pci_disable_device(pdev); + free_irq(pdev->irq, netdev); pci_set_power_state(pdev, PCI_D3hot); return 0; @@ -2781,8 +2780,6 @@ static void e100_shutdown(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3cold, 0); } - free_irq(pdev->irq, netdev); - pci_disable_device(pdev); pci_set_power_state(pdev, PCI_D3hot); } diff --git a/trunk/drivers/net/hamachi.c b/trunk/drivers/net/hamachi.c index b53f6b6491b3..ed407c85708f 100644 --- a/trunk/drivers/net/hamachi.c +++ b/trunk/drivers/net/hamachi.c @@ -204,10 +204,8 @@ KERN_INFO " Further modifications by Keith Underwood /* Condensed bus+endian portability operations. */ #if ADDRLEN == 64 #define cpu_to_leXX(addr) cpu_to_le64(addr) -#define leXX_to_cpu(addr) le64_to_cpu(addr) #else #define cpu_to_leXX(addr) cpu_to_le32(addr) -#define leXX_to_cpu(addr) le32_to_cpu(addr) #endif @@ -467,12 +465,12 @@ enum intr_status_bits { /* The Hamachi Rx and Tx buffer descriptors. */ struct hamachi_desc { - __le32 status_n_length; + u32 status_n_length; #if ADDRLEN == 64 u32 pad; - __le64 addr; + u64 addr; #else - __le32 addr; + u32 addr; #endif }; @@ -876,13 +874,13 @@ static int hamachi_open(struct net_device *dev) #if ADDRLEN == 64 /* writellll anyone ? */ - writel(hmp->rx_ring_dma, ioaddr + RxPtr); - writel(hmp->rx_ring_dma >> 32, ioaddr + RxPtr + 4); - writel(hmp->tx_ring_dma, ioaddr + TxPtr); - writel(hmp->tx_ring_dma >> 32, ioaddr + TxPtr + 4); + writel(cpu_to_le64(hmp->rx_ring_dma), ioaddr + RxPtr); + writel(cpu_to_le64(hmp->rx_ring_dma) >> 32, ioaddr + RxPtr + 4); + writel(cpu_to_le64(hmp->tx_ring_dma), ioaddr + TxPtr); + writel(cpu_to_le64(hmp->tx_ring_dma) >> 32, ioaddr + TxPtr + 4); #else - writel(hmp->rx_ring_dma, ioaddr + RxPtr); - writel(hmp->tx_ring_dma, ioaddr + TxPtr); + writel(cpu_to_le32(hmp->rx_ring_dma), ioaddr + RxPtr); + writel(cpu_to_le32(hmp->tx_ring_dma), ioaddr + TxPtr); #endif /* TODO: It would make sense to organize this as words since the card @@ -1021,8 +1019,8 @@ static inline int hamachi_tx(struct net_device *dev) skb = hmp->tx_skbuff[entry]; if (skb) { pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->tx_ring[entry].addr), - skb->len, PCI_DMA_TODEVICE); + hmp->tx_ring[entry].addr, skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb(skb); hmp->tx_skbuff[entry] = NULL; } @@ -1073,10 +1071,10 @@ static void hamachi_tx_timeout(struct net_device *dev) { printk(KERN_DEBUG " Rx ring %p: ", hmp->rx_ring); for (i = 0; i < RX_RING_SIZE; i++) - printk(" %8.8x", le32_to_cpu(hmp->rx_ring[i].status_n_length)); + printk(" %8.8x", (unsigned int)hmp->rx_ring[i].status_n_length); printk("\n"KERN_DEBUG" Tx ring %p: ", hmp->tx_ring); for (i = 0; i < TX_RING_SIZE; i++) - printk(" %4.4x", le32_to_cpu(hmp->tx_ring[i].status_n_length)); + printk(" %4.4x", hmp->tx_ring[i].status_n_length); printk("\n"); } @@ -1101,15 +1099,14 @@ static void hamachi_tx_timeout(struct net_device *dev) struct sk_buff *skb; if (i >= TX_RING_SIZE - 1) - hmp->tx_ring[i].status_n_length = - cpu_to_le32(DescEndRing) | - (hmp->tx_ring[i].status_n_length & - cpu_to_le32(0x0000ffff)); + hmp->tx_ring[i].status_n_length = cpu_to_le32( + DescEndRing | + (hmp->tx_ring[i].status_n_length & 0x0000FFFF)); else - hmp->tx_ring[i].status_n_length &= cpu_to_le32(0x0000ffff); + hmp->tx_ring[i].status_n_length &= 0x0000ffff; skb = hmp->tx_skbuff[i]; if (skb){ - pci_unmap_single(hmp->pci_dev, leXX_to_cpu(hmp->tx_ring[i].addr), + pci_unmap_single(hmp->pci_dev, hmp->tx_ring[i].addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb(skb); hmp->tx_skbuff[i] = NULL; @@ -1131,8 +1128,7 @@ static void hamachi_tx_timeout(struct net_device *dev) struct sk_buff *skb = hmp->rx_skbuff[i]; if (skb){ - pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->rx_ring[i].addr), + pci_unmap_single(hmp->pci_dev, hmp->rx_ring[i].addr, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); hmp->rx_skbuff[i] = NULL; @@ -1424,7 +1420,7 @@ static irqreturn_t hamachi_interrupt(int irq, void *dev_instance) /* Free the original skb. */ if (skb){ pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->tx_ring[entry].addr), + hmp->tx_ring[entry].addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb_irq(skb); @@ -1504,11 +1500,11 @@ static int hamachi_rx(struct net_device *dev) if (desc_status & DescOwn) break; pci_dma_sync_single_for_cpu(hmp->pci_dev, - leXX_to_cpu(desc->addr), + desc->addr, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); buf_addr = (u8 *) hmp->rx_skbuff[entry]->data; - frame_status = le32_to_cpu(get_unaligned((__le32*)&(buf_addr[data_size - 12]))); + frame_status = le32_to_cpu(get_unaligned((s32*)&(buf_addr[data_size - 12]))); if (hamachi_debug > 4) printk(KERN_DEBUG " hamachi_rx() status was %8.8x.\n", frame_status); @@ -1522,9 +1518,9 @@ static int hamachi_rx(struct net_device *dev) dev->name, desc, &hmp->rx_ring[hmp->cur_rx % RX_RING_SIZE]); printk(KERN_WARNING "%s: Oversized Ethernet frame -- next status %x/%x last status %x.\n", dev->name, - le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0xffff0000, - le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0x0000ffff, - le32_to_cpu(hmp->rx_ring[(hmp->cur_rx-1) % RX_RING_SIZE].status_n_length)); + hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length & 0xffff0000, + hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length & 0x0000ffff, + hmp->rx_ring[(hmp->cur_rx-1) % RX_RING_SIZE].status_n_length); hmp->stats.rx_length_errors++; } /* else Omit for prototype errata??? */ if (frame_status & 0x00380000) { @@ -1570,7 +1566,7 @@ static int hamachi_rx(struct net_device *dev) #endif skb_reserve(skb, 2); /* 16 byte align the IP header */ pci_dma_sync_single_for_cpu(hmp->pci_dev, - leXX_to_cpu(hmp->rx_ring[entry].addr), + hmp->rx_ring[entry].addr, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); /* Call copy + cksum if available. */ @@ -1583,12 +1579,12 @@ static int hamachi_rx(struct net_device *dev) + entry*sizeof(*desc), pkt_len); #endif pci_dma_sync_single_for_device(hmp->pci_dev, - leXX_to_cpu(hmp->rx_ring[entry].addr), + hmp->rx_ring[entry].addr, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); } else { pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->rx_ring[entry].addr), + hmp->rx_ring[entry].addr, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_put(skb = hmp->rx_skbuff[entry], pkt_len); hmp->rx_skbuff[entry] = NULL; @@ -1791,21 +1787,21 @@ static int hamachi_close(struct net_device *dev) for (i = 0; i < RX_RING_SIZE; i++) { skb = hmp->rx_skbuff[i]; hmp->rx_ring[i].status_n_length = 0; + hmp->rx_ring[i].addr = 0xBADF00D0; /* An invalid address. */ if (skb) { pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->rx_ring[i].addr), - hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); + hmp->rx_ring[i].addr, hmp->rx_buf_sz, + PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); hmp->rx_skbuff[i] = NULL; } - hmp->rx_ring[i].addr = cpu_to_leXX(0xBADF00D0); /* An invalid address. */ } for (i = 0; i < TX_RING_SIZE; i++) { skb = hmp->tx_skbuff[i]; if (skb) { pci_unmap_single(hmp->pci_dev, - leXX_to_cpu(hmp->tx_ring[i].addr), - skb->len, PCI_DMA_TODEVICE); + hmp->tx_ring[i].addr, skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb(skb); hmp->tx_skbuff[i] = NULL; } diff --git a/trunk/drivers/net/ibm_newemac/debug.c b/trunk/drivers/net/ibm_newemac/debug.c index 86b756a30784..a2fc660ca5d4 100644 --- a/trunk/drivers/net/ibm_newemac/debug.c +++ b/trunk/drivers/net/ibm_newemac/debug.c @@ -26,7 +26,7 @@ #include "core.h" -static DEFINE_SPINLOCK(emac_dbg_lock); +static spinlock_t emac_dbg_lock = SPIN_LOCK_UNLOCKED; static void emac_desc_dump(struct emac_instance *p) { diff --git a/trunk/drivers/net/ixgb/ixgb_main.c b/trunk/drivers/net/ixgb/ixgb_main.c index bf9085fe035a..3021234b1e17 100644 --- a/trunk/drivers/net/ixgb/ixgb_main.c +++ b/trunk/drivers/net/ixgb/ixgb_main.c @@ -320,22 +320,10 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog) void ixgb_reset(struct ixgb_adapter *adapter) { - struct ixgb_hw *hw = &adapter->hw; - ixgb_adapter_stop(hw); - if (!ixgb_init_hw(hw)) + ixgb_adapter_stop(&adapter->hw); + if(!ixgb_init_hw(&adapter->hw)) DPRINTK(PROBE, ERR, "ixgb_init_hw failed.\n"); - - /* restore frame size information */ - IXGB_WRITE_REG(hw, MFS, hw->max_frame_size << IXGB_MFS_SHIFT); - if (hw->max_frame_size > - IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS + ENET_FCS_LENGTH) { - u32 ctrl0 = IXGB_READ_REG(hw, CTRL0); - if (!(ctrl0 & IXGB_CTRL0_JFE)) { - ctrl0 |= IXGB_CTRL0_JFE; - IXGB_WRITE_REG(hw, CTRL0, ctrl0); - } - } } /** diff --git a/trunk/drivers/net/pcmcia/pcnet_cs.c b/trunk/drivers/net/pcmcia/pcnet_cs.c index 51bbd582f16c..db6a97d1d7b1 100644 --- a/trunk/drivers/net/pcmcia/pcnet_cs.c +++ b/trunk/drivers/net/pcmcia/pcnet_cs.c @@ -1746,7 +1746,6 @@ static struct pcmcia_device_id pcnet_ids[] = { PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"), - PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", 0xb4be14e3, 0x43ac239b, 0x0877b627), PCMCIA_DEVICE_NULL diff --git a/trunk/drivers/net/s2io.c b/trunk/drivers/net/s2io.c index 9d80f1cf73ac..121cb100f93a 100644 --- a/trunk/drivers/net/s2io.c +++ b/trunk/drivers/net/s2io.c @@ -3737,7 +3737,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic) } /* Handle software interrupt used during MSI(X) test */ -static irqreturn_t s2io_test_intr(int irq, void *dev_id) +static irqreturn_t __devinit s2io_test_intr(int irq, void *dev_id) { struct s2io_nic *sp = dev_id; @@ -3748,7 +3748,7 @@ static irqreturn_t s2io_test_intr(int irq, void *dev_id) } /* Test interrupt path by forcing a a software IRQ */ -static int s2io_test_msi(struct s2io_nic *sp) +static int __devinit s2io_test_msi(struct s2io_nic *sp) { struct pci_dev *pdev = sp->pdev; struct XENA_dev_config __iomem *bar0 = sp->bar0; diff --git a/trunk/drivers/net/sis190.c b/trunk/drivers/net/sis190.c index 7eab072ae792..720088396bb9 100644 --- a/trunk/drivers/net/sis190.c +++ b/trunk/drivers/net/sis190.c @@ -474,7 +474,7 @@ static inline void sis190_map_to_asic(struct RxDesc *desc, dma_addr_t mapping, static inline void sis190_make_unusable_by_asic(struct RxDesc *desc) { desc->PSize = 0x0; - desc->addr = cpu_to_le32(0xdeadbeef); + desc->addr = 0xdeadbeef; desc->size &= cpu_to_le32(RingEnd); wmb(); desc->status = 0x0; @@ -580,7 +580,7 @@ static int sis190_rx_interrupt(struct net_device *dev, struct RxDesc *desc = tp->RxDescRing + entry; u32 status; - if (le32_to_cpu(desc->status) & OWNbit) + if (desc->status & OWNbit) break; status = le32_to_cpu(desc->PSize); @@ -1381,7 +1381,7 @@ static int __devinit sis190_mii_probe(struct net_device *dev) return rc; } -static void sis190_mii_remove(struct net_device *dev) +static void __devexit sis190_mii_remove(struct net_device *dev) { struct sis190_private *tp = netdev_priv(dev); @@ -1538,9 +1538,9 @@ static int __devinit sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev, /* Get MAC address from EEPROM */ for (i = 0; i < MAC_ADDR_LEN / 2; i++) { - u16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i); + __le16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i); - ((__le16 *)dev->dev_addr)[i] = cpu_to_le16(w); + ((u16 *)dev->dev_addr)[i] = le16_to_cpu(w); } sis190_set_rgmii(tp, sis190_read_eeprom(ioaddr, EEPROMInfo)); diff --git a/trunk/drivers/net/sky2.c b/trunk/drivers/net/sky2.c index a74fc11a6482..6197afb3ed83 100644 --- a/trunk/drivers/net/sky2.c +++ b/trunk/drivers/net/sky2.c @@ -822,13 +822,8 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), rx_reg); - if (hw->chip_id == CHIP_ID_YUKON_XL) { - /* Hardware errata - clear flush mask */ - sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), 0); - } else { - /* Flush Rx MAC FIFO on any flow control or error */ - sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); - } + /* Flush Rx MAC FIFO on any flow control or error */ + sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); /* Set threshold to 0xa (64 bytes) + 1 to workaround pause bug */ reg = RX_GMF_FL_THR_DEF + 1; diff --git a/trunk/drivers/net/smc911x.h b/trunk/drivers/net/smc911x.h index 7defa63b9c74..d04e4fa35206 100644 --- a/trunk/drivers/net/smc911x.h +++ b/trunk/drivers/net/smc911x.h @@ -76,7 +76,7 @@ -#ifdef SMC_USE_PXA_DMA +#if SMC_USE_PXA_DMA #define SMC_USE_DMA /* diff --git a/trunk/drivers/net/starfire.c b/trunk/drivers/net/starfire.c index 6e00dc857afa..bcc430bd9e49 100644 --- a/trunk/drivers/net/starfire.c +++ b/trunk/drivers/net/starfire.c @@ -1742,7 +1742,7 @@ static void set_rx_mode(struct net_device *dev) if (vlan_group_get_device(np->vlgrp, i)) { if (vlan_count >= 32) break; - writew(i, filter_addr); + writew(cpu_to_be16(i), filter_addr); filter_addr += 16; vlan_count++; } diff --git a/trunk/drivers/net/sundance.c b/trunk/drivers/net/sundance.c index 0a6186d4a48e..ff98f5d597f1 100644 --- a/trunk/drivers/net/sundance.c +++ b/trunk/drivers/net/sundance.c @@ -340,9 +340,9 @@ enum mac_ctrl1_bits { /* Note that using only 32 bit fields simplifies conversion to big-endian architectures. */ struct netdev_desc { - __le32 next_desc; - __le32 status; - struct desc_frag { __le32 addr, length; } frag[1]; + u32 next_desc; + u32 status; + struct desc_frag { u32 addr, length; } frag[1]; }; /* Bits in netdev_desc.status */ @@ -495,8 +495,8 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev, goto err_out_res; for (i = 0; i < 3; i++) - ((__le16 *)dev->dev_addr)[i] = - cpu_to_le16(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); + ((u16 *)dev->dev_addr)[i] = + le16_to_cpu(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); dev->base_addr = (unsigned long)ioaddr; @@ -1090,8 +1090,8 @@ reset_tx (struct net_device *dev) skb = np->tx_skbuff[i]; if (skb) { pci_unmap_single(np->pci_dev, - le32_to_cpu(np->tx_ring[i].frag[0].addr), - skb->len, PCI_DMA_TODEVICE); + np->tx_ring[i].frag[0].addr, skb->len, + PCI_DMA_TODEVICE); if (irq) dev_kfree_skb_irq (skb); else @@ -1214,7 +1214,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) skb = np->tx_skbuff[entry]; /* Free the original skb. */ pci_unmap_single(np->pci_dev, - le32_to_cpu(np->tx_ring[entry].frag[0].addr), + np->tx_ring[entry].frag[0].addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb_irq (np->tx_skbuff[entry]); np->tx_skbuff[entry] = NULL; @@ -1233,7 +1233,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) skb = np->tx_skbuff[entry]; /* Free the original skb. */ pci_unmap_single(np->pci_dev, - le32_to_cpu(np->tx_ring[entry].frag[0].addr), + np->tx_ring[entry].frag[0].addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb_irq (np->tx_skbuff[entry]); np->tx_skbuff[entry] = NULL; @@ -1311,19 +1311,19 @@ static void rx_poll(unsigned long data) && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { skb_reserve(skb, 2); /* 16 byte align the IP header */ pci_dma_sync_single_for_cpu(np->pci_dev, - le32_to_cpu(desc->frag[0].addr), + desc->frag[0].addr, np->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_copy_to_linear_data(skb, np->rx_skbuff[entry]->data, pkt_len); pci_dma_sync_single_for_device(np->pci_dev, - le32_to_cpu(desc->frag[0].addr), + desc->frag[0].addr, np->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_put(skb, pkt_len); } else { pci_unmap_single(np->pci_dev, - le32_to_cpu(desc->frag[0].addr), + desc->frag[0].addr, np->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_put(skb = np->rx_skbuff[entry], pkt_len); @@ -1709,23 +1709,23 @@ static int netdev_close(struct net_device *dev) /* Free all the skbuffs in the Rx queue. */ for (i = 0; i < RX_RING_SIZE; i++) { np->rx_ring[i].status = 0; + np->rx_ring[i].frag[0].addr = 0xBADF00D0; /* An invalid address. */ skb = np->rx_skbuff[i]; if (skb) { pci_unmap_single(np->pci_dev, - le32_to_cpu(np->rx_ring[i].frag[0].addr), - np->rx_buf_sz, PCI_DMA_FROMDEVICE); + np->rx_ring[i].frag[0].addr, np->rx_buf_sz, + PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); np->rx_skbuff[i] = NULL; } - np->rx_ring[i].frag[0].addr = cpu_to_le32(0xBADF00D0); /* poison */ } for (i = 0; i < TX_RING_SIZE; i++) { np->tx_ring[i].next_desc = 0; skb = np->tx_skbuff[i]; if (skb) { pci_unmap_single(np->pci_dev, - le32_to_cpu(np->tx_ring[i].frag[0].addr), - skb->len, PCI_DMA_TODEVICE); + np->tx_ring[i].frag[0].addr, skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb(skb); np->tx_skbuff[i] = NULL; } diff --git a/trunk/drivers/net/ucc_geth.c b/trunk/drivers/net/ucc_geth.c index abac7db3819e..7f689907ac28 100644 --- a/trunk/drivers/net/ucc_geth.c +++ b/trunk/drivers/net/ucc_geth.c @@ -3447,7 +3447,7 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit u16 length, howmany = 0; u32 bd_status; u8 *bdBuffer; - struct net_device *dev; + struct net_device * dev; ugeth_vdbg("%s: IN", __FUNCTION__); diff --git a/trunk/drivers/net/ucc_geth_mii.h b/trunk/drivers/net/ucc_geth_mii.h index 1e45b2028a50..d83437039919 100644 --- a/trunk/drivers/net/ucc_geth_mii.h +++ b/trunk/drivers/net/ucc_geth_mii.h @@ -96,5 +96,5 @@ enum enet_tbi_mii_reg { int uec_mdio_read(struct mii_bus *bus, int mii_id, int regnum); int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value); int __init uec_mdio_init(void); -void uec_mdio_exit(void); +void __exit uec_mdio_exit(void); #endif /* __UEC_MII_H */ diff --git a/trunk/drivers/s390/net/ctcmain.c b/trunk/drivers/s390/net/ctcmain.c index 77a503139e32..97adc701a819 100644 --- a/trunk/drivers/s390/net/ctcmain.c +++ b/trunk/drivers/s390/net/ctcmain.c @@ -478,14 +478,14 @@ ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb) skb->dev = pskb->dev; skb->protocol = pskb->protocol; pskb->ip_summed = CHECKSUM_UNNECESSARY; + netif_rx_ni(skb); /** - * reset logflags + * Successful rx; reset logflags */ ch->logflags = 0; + dev->last_rx = jiffies; privptr->stats.rx_packets++; privptr->stats.rx_bytes += skb->len; - netif_rx_ni(skb); - dev->last_rx = jiffies; if (len > 0) { skb_pull(pskb, header->length); if (skb_tailroom(pskb) < LL_HEADER_LENGTH) { diff --git a/trunk/drivers/s390/net/netiucv.c b/trunk/drivers/s390/net/netiucv.c index c7ea9381db9f..4d18d6419ddc 100644 --- a/trunk/drivers/s390/net/netiucv.c +++ b/trunk/drivers/s390/net/netiucv.c @@ -639,14 +639,14 @@ static void netiucv_unpack_skb(struct iucv_connection *conn, skb->dev = pskb->dev; skb->protocol = pskb->protocol; pskb->ip_summed = CHECKSUM_UNNECESSARY; - privptr->stats.rx_packets++; - privptr->stats.rx_bytes += skb->len; /* * Since receiving is always initiated from a tasklet (in iucv.c), * we must use netif_rx_ni() instead of netif_rx() */ netif_rx_ni(skb); dev->last_rx = jiffies; + privptr->stats.rx_packets++; + privptr->stats.rx_bytes += skb->len; skb_pull(pskb, header->next); skb_put(pskb, NETIUCV_HDRLEN); } diff --git a/trunk/drivers/serial/suncore.c b/trunk/drivers/serial/suncore.c index 707c5b03bce9..70a09a3d5af0 100644 --- a/trunk/drivers/serial/suncore.c +++ b/trunk/drivers/serial/suncore.c @@ -23,36 +23,11 @@ #include "suncore.h" -static int sunserial_current_minor = 64; +int sunserial_current_minor = 64; -int sunserial_register_minors(struct uart_driver *drv, int count) -{ - int err = 0; - - drv->minor = sunserial_current_minor; - drv->nr += count; - /* Register the driver on the first call */ - if (drv->nr == count) - err = uart_register_driver(drv); - if (err == 0) { - sunserial_current_minor += count; - drv->tty_driver->name_base = drv->minor - 64; - } - return err; -} -EXPORT_SYMBOL(sunserial_register_minors); - -void sunserial_unregister_minors(struct uart_driver *drv, int count) -{ - drv->nr -= count; - sunserial_current_minor -= count; - - if (drv->nr == 0) - uart_unregister_driver(drv); -} -EXPORT_SYMBOL(sunserial_unregister_minors); +EXPORT_SYMBOL(sunserial_current_minor); -int __init sunserial_console_match(struct console *con, struct device_node *dp, +int sunserial_console_match(struct console *con, struct device_node *dp, struct uart_driver *drv, int line) { int off; @@ -158,6 +133,8 @@ sunserial_console_termios(struct console *con) con->cflag = cflag; } +EXPORT_SYMBOL(sunserial_console_termios); + /* Sun serial MOUSE auto baud rate detection. */ static struct mouse_baud_cflag { int baud; diff --git a/trunk/drivers/serial/suncore.h b/trunk/drivers/serial/suncore.h index 042668aa602e..829d7d65d6db 100644 --- a/trunk/drivers/serial/suncore.h +++ b/trunk/drivers/serial/suncore.h @@ -22,8 +22,7 @@ extern unsigned int suncore_mouse_baud_cflag_next(unsigned int, int *); extern int suncore_mouse_baud_detection(unsigned char, int); -extern int sunserial_register_minors(struct uart_driver *, int); -extern void sunserial_unregister_minors(struct uart_driver *, int); +extern int sunserial_current_minor; extern int sunserial_console_match(struct console *, struct device_node *, struct uart_driver *, int); diff --git a/trunk/drivers/serial/sunhv.c b/trunk/drivers/serial/sunhv.c index be0fe152891b..8ff900b09811 100644 --- a/trunk/drivers/serial/sunhv.c +++ b/trunk/drivers/serial/sunhv.c @@ -562,10 +562,16 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m port->dev = &op->dev; - err = sunserial_register_minors(&sunhv_reg, 1); + sunhv_reg.minor = sunserial_current_minor; + sunhv_reg.nr = 1; + + err = uart_register_driver(&sunhv_reg); if (err) goto out_free_con_read_page; + sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; + sunserial_current_minor += 1; + sunserial_console_match(&sunhv_console, op->node, &sunhv_reg, port->line); @@ -585,7 +591,8 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m uart_remove_one_port(&sunhv_reg, port); out_unregister_driver: - sunserial_unregister_minors(&sunhv_reg, 1); + sunserial_current_minor -= 1; + uart_unregister_driver(&sunhv_reg); out_free_con_read_page: kfree(con_read_page); @@ -607,7 +614,8 @@ static int __devexit hv_remove(struct of_device *dev) uart_remove_one_port(&sunhv_reg, port); - sunserial_unregister_minors(&sunhv_reg, 1); + sunserial_current_minor -= 1; + uart_unregister_driver(&sunhv_reg); kfree(port); sunhv_port = NULL; diff --git a/trunk/drivers/serial/sunsab.c b/trunk/drivers/serial/sunsab.c index 543f93741e6f..ff610c23314b 100644 --- a/trunk/drivers/serial/sunsab.c +++ b/trunk/drivers/serial/sunsab.c @@ -832,6 +832,7 @@ static struct uart_driver sunsab_reg = { }; static struct uart_sunsab_port *sunsab_ports; +static int num_channels; #ifdef CONFIG_SERIAL_SUNSAB_CONSOLE @@ -1101,8 +1102,8 @@ static int __init sunsab_init(void) { struct device_node *dp; int err; - int num_channels = 0; + num_channels = 0; for_each_node_by_name(dp, "se") num_channels += 2; for_each_node_by_name(dp, "serial") { @@ -1116,14 +1117,20 @@ static int __init sunsab_init(void) if (!sunsab_ports) return -ENOMEM; + sunsab_reg.minor = sunserial_current_minor; + sunsab_reg.nr = num_channels; sunsab_reg.cons = SUNSAB_CONSOLE(); - err = sunserial_register_minors(&sunsab_reg, num_channels); + + err = uart_register_driver(&sunsab_reg); if (err) { kfree(sunsab_ports); sunsab_ports = NULL; return err; } + + sunsab_reg.tty_driver->name_base = sunsab_reg.minor - 64; + sunserial_current_minor += num_channels; } return of_register_driver(&sab_driver, &of_bus_type); @@ -1132,8 +1139,9 @@ static int __init sunsab_init(void) static void __exit sunsab_exit(void) { of_unregister_driver(&sab_driver); - if (sunsab_reg.nr) { - sunserial_unregister_minors(&sunsab_reg, sunsab_reg.nr); + if (num_channels) { + sunserial_current_minor -= num_channels; + uart_unregister_driver(&sunsab_reg); } kfree(sunsab_ports); diff --git a/trunk/drivers/serial/sunsu.c b/trunk/drivers/serial/sunsu.c index 4e2302d43ab1..e074943feff5 100644 --- a/trunk/drivers/serial/sunsu.c +++ b/trunk/drivers/serial/sunsu.c @@ -1528,12 +1528,14 @@ static struct of_platform_driver su_driver = { .remove = __devexit_p(su_remove), }; +static int num_uart; + static int __init sunsu_init(void) { struct device_node *dp; int err; - int num_uart = 0; + num_uart = 0; for_each_node_by_name(dp, "su") { if (su_get_type(dp) == SU_PORT_PORT) num_uart++; @@ -1550,22 +1552,26 @@ static int __init sunsu_init(void) } if (num_uart) { - err = sunserial_register_minors(&sunsu_reg, num_uart); + sunsu_reg.minor = sunserial_current_minor; + sunsu_reg.nr = num_uart; + err = uart_register_driver(&sunsu_reg); if (err) return err; + sunsu_reg.tty_driver->name_base = sunsu_reg.minor - 64; + sunserial_current_minor += num_uart; } err = of_register_driver(&su_driver, &of_bus_type); if (err && num_uart) - sunserial_unregister_minors(&sunsu_reg, num_uart); + uart_unregister_driver(&sunsu_reg); return err; } static void __exit sunsu_exit(void) { - if (sunsu_reg.nr) - sunserial_unregister_minors(&sunsu_reg, sunsu_reg.nr); + if (num_uart) + uart_unregister_driver(&sunsu_reg); } module_init(sunsu_init); diff --git a/trunk/drivers/serial/sunzilog.c b/trunk/drivers/serial/sunzilog.c index cb2e40506379..283bef0d24cb 100644 --- a/trunk/drivers/serial/sunzilog.c +++ b/trunk/drivers/serial/sunzilog.c @@ -63,6 +63,10 @@ readb(&((__channel)->control)) #endif +static int num_sunzilog; +#define NUM_SUNZILOG num_sunzilog +#define NUM_CHANNELS (NUM_SUNZILOG * 2) + #define ZS_CLOCK 4915200 /* Zilog input clock rate. */ #define ZS_CLOCK_DIVISOR 16 /* Divisor this driver uses. */ @@ -1027,19 +1031,18 @@ static struct uart_driver sunzilog_reg = { .major = TTY_MAJOR, }; -static int __init sunzilog_alloc_tables(int num_sunzilog) +static int __init sunzilog_alloc_tables(void) { struct uart_sunzilog_port *up; unsigned long size; - int num_channels = num_sunzilog * 2; int i; - size = num_channels * sizeof(struct uart_sunzilog_port); + size = NUM_CHANNELS * sizeof(struct uart_sunzilog_port); sunzilog_port_table = kzalloc(size, GFP_KERNEL); if (!sunzilog_port_table) return -ENOMEM; - for (i = 0; i < num_channels; i++) { + for (i = 0; i < NUM_CHANNELS; i++) { up = &sunzilog_port_table[i]; spin_lock_init(&up->port.lock); @@ -1047,13 +1050,13 @@ static int __init sunzilog_alloc_tables(int num_sunzilog) if (i == 0) sunzilog_irq_chain = up; - if (i < num_channels - 1) + if (i < NUM_CHANNELS - 1) up->next = up + 1; else up->next = NULL; } - size = num_sunzilog * sizeof(struct zilog_layout __iomem *); + size = NUM_SUNZILOG * sizeof(struct zilog_layout __iomem *); sunzilog_chip_regs = kzalloc(size, GFP_KERNEL); if (!sunzilog_chip_regs) { kfree(sunzilog_port_table); @@ -1493,28 +1496,34 @@ static int __init sunzilog_init(void) struct device_node *dp; int err, uart_count; int num_keybms; - int num_sunzilog = 0; + NUM_SUNZILOG = 0; num_keybms = 0; for_each_node_by_name(dp, "zs") { - num_sunzilog++; + NUM_SUNZILOG++; if (of_find_property(dp, "keyboard", NULL)) num_keybms++; } uart_count = 0; - if (num_sunzilog) { + if (NUM_SUNZILOG) { int uart_count; - err = sunzilog_alloc_tables(num_sunzilog); + err = sunzilog_alloc_tables(); if (err) goto out; - uart_count = (num_sunzilog * 2) - (2 * num_keybms); + uart_count = (NUM_SUNZILOG * 2) - (2 * num_keybms); - err = sunserial_register_minors(&sunzilog_reg, uart_count); + sunzilog_reg.nr = uart_count; + sunzilog_reg.minor = sunserial_current_minor; + err = uart_register_driver(&sunzilog_reg); if (err) goto out_free_tables; + + sunzilog_reg.tty_driver->name_base = sunzilog_reg.minor - 64; + + sunserial_current_minor += uart_count; } err = of_register_driver(&zs_driver, &of_bus_type); @@ -1548,8 +1557,8 @@ static int __init sunzilog_init(void) of_unregister_driver(&zs_driver); out_unregister_uart: - if (num_sunzilog) { - sunserial_unregister_minors(&sunzilog_reg, num_sunzilog); + if (NUM_SUNZILOG) { + uart_unregister_driver(&sunzilog_reg); sunzilog_reg.cons = NULL; } @@ -1581,8 +1590,8 @@ static void __exit sunzilog_exit(void) zilog_irq = -1; } - if (sunzilog_reg.nr) { - sunserial_unregister_minors(&sunzilog_reg, sunzilog_reg.nr); + if (NUM_SUNZILOG) { + uart_unregister_driver(&sunzilog_reg); sunzilog_free_tables(); } } diff --git a/trunk/include/media/videobuf-core.h b/trunk/include/media/videobuf-core.h index 4fd5d0eaa935..0fa5d5912555 100644 --- a/trunk/include/media/videobuf-core.h +++ b/trunk/include/media/videobuf-core.h @@ -208,8 +208,6 @@ int videobuf_cgmbuf(struct videobuf_queue *q, int videobuf_streamon(struct videobuf_queue *q); int videobuf_streamoff(struct videobuf_queue *q); -void videobuf_stop(struct videobuf_queue *q); - int videobuf_read_start(struct videobuf_queue *q); void videobuf_read_stop(struct videobuf_queue *q); ssize_t videobuf_read_stream(struct videobuf_queue *q, diff --git a/trunk/net/8021q/vlan.c b/trunk/net/8021q/vlan.c index 4add9bd4bc8d..5b183156307a 100644 --- a/trunk/net/8021q/vlan.c +++ b/trunk/net/8021q/vlan.c @@ -124,8 +124,8 @@ static void __exit vlan_cleanup_module(void) { int i; - vlan_ioctl_set(NULL); vlan_netlink_fini(); + vlan_ioctl_set(NULL); /* Un-register us from receiving netdevice events */ unregister_netdevice_notifier(&vlan_notifier_block); diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 26a3a3a15be0..86d62611f2fc 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -3972,7 +3972,8 @@ void synchronize_net(void) * @dev: device * * This function shuts down a device interface and removes it - * from the kernel tables. + * from the kernel tables. On success 0 is returned, on a failure + * a negative errno code is returned. * * Callers must hold the rtnl semaphore. You may want * unregister_netdev() instead of this. @@ -3990,7 +3991,8 @@ void unregister_netdevice(struct net_device *dev) * @dev: device * * This function shuts down a device interface and removes it - * from the kernel tables. + * from the kernel tables. On success 0 is returned, on a failure + * a negative errno code is returned. * * This is just a wrapper for unregister_netdevice that takes * the rtnl semaphore. In general you want to use this and not diff --git a/trunk/net/ipv4/devinet.c b/trunk/net/ipv4/devinet.c index 3168c3de4919..55d199e4ae21 100644 --- a/trunk/net/ipv4/devinet.c +++ b/trunk/net/ipv4/devinet.c @@ -516,6 +516,8 @@ static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh) goto errout; } + ipv4_devconf_setall(in_dev); + ifa = inet_alloc_ifa(); if (ifa == NULL) { /* @@ -526,7 +528,6 @@ static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh) goto errout; } - ipv4_devconf_setall(in_dev); in_dev_hold(in_dev); if (tb[IFA_ADDRESS] == NULL) diff --git a/trunk/net/ipv4/esp4.c b/trunk/net/ipv4/esp4.c index 1738113268bc..c31bccb9b526 100644 --- a/trunk/net/ipv4/esp4.c +++ b/trunk/net/ipv4/esp4.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -225,10 +224,6 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) /* ... check padding bits here. Silly. :-) */ - /* RFC4303: Drop dummy packets without any error */ - if (nexthdr[1] == IPPROTO_NONE) - goto out; - iph = ip_hdr(skb); ihl = iph->ihl * 4; diff --git a/trunk/net/ipv6/esp6.c b/trunk/net/ipv6/esp6.c index 444053254676..7db66f10e00d 100644 --- a/trunk/net/ipv6/esp6.c +++ b/trunk/net/ipv6/esp6.c @@ -230,12 +230,6 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) } /* ... check padding bits here. Silly. :-) */ - /* RFC4303: Drop dummy packets without any error */ - if (nexthdr[1] == IPPROTO_NONE) { - ret = -EINVAL; - goto out; - } - pskb_trim(skb, skb->len - alen - padlen - 2); ret = nexthdr[1]; } diff --git a/trunk/net/ipv6/xfrm6_policy.c b/trunk/net/ipv6/xfrm6_policy.c index b8e9eb445d74..82e27b80d07d 100644 --- a/trunk/net/ipv6/xfrm6_policy.c +++ b/trunk/net/ipv6/xfrm6_policy.c @@ -233,7 +233,7 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int dst_prev->output = dst_prev->xfrm->outer_mode->afinfo->output; /* Sheit... I remember I did this right. Apparently, * it was magically lost, so this code needs audit */ - x->u.rt6.rt6i_flags = rt0->rt6i_flags&(RTF_ANYCAST|RTF_LOCAL); + x->u.rt6.rt6i_flags = rt0->rt6i_flags&(RTCF_BROADCAST|RTCF_MULTICAST|RTCF_LOCAL); x->u.rt6.rt6i_metric = rt0->rt6i_metric; x->u.rt6.rt6i_node = rt0->rt6i_node; x->u.rt6.rt6i_gateway = rt0->rt6i_gateway; diff --git a/trunk/net/xfrm/xfrm_policy.c b/trunk/net/xfrm/xfrm_policy.c index b91b16671c1e..9a4cf2e45a15 100644 --- a/trunk/net/xfrm/xfrm_policy.c +++ b/trunk/net/xfrm/xfrm_policy.c @@ -1318,9 +1318,8 @@ int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, if (sk && sk->sk_policy[XFRM_POLICY_OUT]) { policy = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl); - err = PTR_ERR(policy); if (IS_ERR(policy)) - goto dropdst; + return PTR_ERR(policy); } if (!policy) { @@ -1331,9 +1330,8 @@ int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, policy = flow_cache_lookup(fl, dst_orig->ops->family, dir, xfrm_policy_lookup); - err = PTR_ERR(policy); if (IS_ERR(policy)) - goto dropdst; + return PTR_ERR(policy); } if (!policy) @@ -1503,9 +1501,8 @@ int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, return 0; error: - xfrm_pols_put(pols, npols); -dropdst: dst_release(dst_orig); + xfrm_pols_put(pols, npols); *dst_p = NULL; return err; }