Linux 4.4.213
Greg KH
maintainerI'm announcing the release of the 4.4.213 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm64/boot/Makefile | 2 crypto/af_alg.c | 6 crypto/pcrypt.c | 3 drivers/atm/eni.c | 4 drivers/char/ttyprintk.c | 15 + drivers/clk/mmp/clk-of-mmp2.c | 2 drivers/media/radio/si470x/radio-si470x-i2c.c | 2 drivers/media/usb/dvb-usb/digitv.c | 10 - drivers/media/usb/dvb-usb/dvb-usb-urb.c | 2 drivers/media/usb/gspca/gspca.c | 2 drivers/net/ethernet/broadcom/b44.c | 9 - drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 3 drivers/net/ethernet/chelsio/cxgb4/l2t.c | 3 drivers/net/ethernet/freescale/xgmac_mdio.c | 7 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 37 +++- drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 drivers/net/ethernet/natsemi/sonic.c | 109 +++++++++++--- drivers/net/ethernet/natsemi/sonic.h | 25 +-- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 1 drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 2 drivers/net/usb/r8152.c | 9 - drivers/net/wan/sdla.c | 2 drivers/net/wireless/airo.c | 20 +- drivers/net/wireless/ath/ath9k/hif_usb.c | 2 drivers/net/wireless/brcm80211/brcmfmac/usb.c | 4 drivers/net/wireless/orinoco/orinoco_usb.c | 4 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 2 drivers/net/wireless/rsi/rsi_91x_usb.c | 2 drivers/net/wireless/zd1211rw/zd_usb.c | 2 drivers/scsi/fnic/fnic_scsi.c | 3 drivers/staging/most/aim-network/networking.c | 10 + drivers/staging/vt6656/device.h | 2 drivers/staging/vt6656/int.c | 6 drivers/staging/vt6656/main_usb.c | 1 drivers/staging/vt6656/rxtx.c | 26 +-- drivers/staging/wlan-ng/prism2mgmt.c | 2 drivers/usb/dwc3/core.c | 3 drivers/usb/serial/ir-usb.c | 136 +++++++++++++----- drivers/usb/storage/unusual_uas.h | 7 drivers/watchdog/rn5t618_wdt.c | 1 fs/btrfs/super.c | 24 ++- fs/namei.c | 4 fs/reiserfs/super.c | 2 include/linux/usb/irda.h | 13 + mm/mempolicy.c | 6 net/core/utils.c | 20 ++ net/ipv4/ip_vti.c | 13 + net/ipv6/ip6_vti.c | 13 + net/sched/ematch.c | 3 net/wireless/wext-core.c | 3 sound/core/pcm_native.c | 2 52 files changed, 434 insertions(+), 164 deletions(-)
Al Viro (1):
vfs: fix do_last() regression
Andreas Kemnade (1):
watchdog: rn5t618_wdt: fix module aliases
Andrey Shvetsov (1):
staging: most: net: fix buffer overflow
Arnd Bergmann (2):
atm: eni: fix uninitialized variable warning
wireless: wext: avoid gcc -O3 warning
Bin Liu (1):
usb: dwc3: turn off VBUS when leaving host mode
Cambda Zhu (1):
ixgbe: Fix calculation of queue with VFs and flow director on interface flap
Colin Ian King (1):
staging: wlan-ng: ensure error return is actually returned
Dan Carpenter (1):
mm/mempolicy.c: fix out of bounds write in mpol_parse_str()
Dirk Behme (1):
arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean'
Eric Dumazet (1):
net_sched: ematch: reject invalid TCF_EM_SIMPLE
Fenghua Yu (1):
drivers/net/b44: Change to non-atomic bit operations on pwol_mask
Finn Thain (4):
net/sonic: Add mutual exclusion for accessing shared state net/sonic: Use MMIO accessors
net/sonic: Fix receive buffer handling
net/sonic: Quiesce SONIC before re-initializing descriptor memory
Greg Kroah-Hartman (1):
Linux 4.4.213
Hannes Reinecke (1):
scsi: fnic: do not queue commands during fwreset
Hans Verkuil (2):
media: gspca: zero usb_buf
media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0
Hayes Wang (1):
r8152: get default setting of WOL before initializing
Herbert Xu (2):
crypto: af_alg - Use bh_lock_sock in sk_destruct
crypto: pcrypt - Fix user-after-free on module unload
Jan Kara (1):
reiserfs: Fix memory leak of journal device string
Johan Hovold (9):
orinoco_usb: fix interface sanity check
rsi_91x_usb: fix interface sanity check
USB: serial: ir-usb: add missing endpoint sanity check
USB: serial: ir-usb: fix link-speed handling
USB: serial: ir-usb: fix IrLAP framing
ath9k: fix storage endpoint lookup
brcmfmac: fix interface sanity check
rtl8xxxu: fix interface sanity check
zd1211rw: fix storage endpoint lookup
Josef Bacik (1):
btrfs: do not zero f_bavail if we have available space
Krzysztof Kozlowski (1):
net: wan: sdla: Fix cast from pointer to integer of different size
Laura Abbott (1):
usb-storage: Disable UAS on JMicron SATA enclosure
Lee Jones (1):
media: si470x-i2c: Move free() past last use of 'radio'
Lubomir Rintel (1):
clk: mmp2: Fix the order of timer mux parents
Luis de Bethencourt (1):
btrfs: fix mixed block count of available space
Madalin Bucur (1):
net/fsl: treat fsl,erratum-a011043
Malcolm Priestley (3):
staging: vt6656: correct packet types for CTS protect, mode.
staging: vt6656: use NULLFUCTION stack on mac80211
staging: vt6656: Fix false Tx excessive retries reporting.
Manish Chopra (1):
qlcnic: Fix CPU soft lockup while collecting firmware dump
Michael Ellerman (2):
airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE
airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE
Nicolas Dichtel (1):
vti[6]: fix packet tx through bpf_redirect()
Praveen Chaudhary (1):
net: Fix skb->csum update in inet_proto_csum_replace16().
Radoslaw Tyl (1):
ixgbevf: Remove limit of 10 entries for unicast filter list
Sean Young (1):
media: digitv: don't continue if remote control state can't be read
Takashi Iwai (1):
ALSA: pcm: Add missing copy ops check before clearing buffer
Vasily Averin (2):
seq_tab_next() should increase position index l2t_seq_next should increase position index
Zhenzhong Duan (1):
ttyprintk: fix a potential deadlock in interrupt context issue
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 212 +SUBLEVEL = 213 EXTRAVERSION = NAME = Blurry Fish Butt
arch/arm64/boot/Makefile +1 -1
@@ -14,7 +14,7 @@ # Based on the ia64 boot/Makefile. # -targets := Image Image.gz +targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo $(obj)/Image: vmlinux FORCE $(call if_changed,objcopy)
crypto/af_alg.c +4 -2
@@ -136,11 +136,13 @@ void af_alg_release_parent(struct sock *sk) sk = ask->parent; ask =alg_sk (sk); -lock_sock (sk); +local_bh_disable (); +bh_lock_sock (sk); ask->nokey_refcnt -= nokey;if (!last) last = !--ask->refcnt; -release_sock (sk); +bh_unlock_sock (sk); +local_bh_enable ();if (last)sock_put (sk);
crypto/pcrypt.c +2 -1
@@ -505,11 +505,12 @@ err: static void __exit pcrypt_exit(void) { +crypto_unregister_template (&pcrypt_tmpl); +pcrypt_fini_padata (&pencrypt);pcrypt_fini_padata (&pdecrypt);kset_unregister (pcrypt_kset); -crypto_unregister_template (&pcrypt_tmpl); }module_init (pcrypt_init);
drivers/atm/eni.c +2 -2
@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, here = (eni_vcc->descr+skip) & (eni_vcc->words-1 ); dma[j++] = (here <<MID_DMA_COUNT_SHIFT ) | (vcc->vci <<MID_DMA_VCI_SHIFT ) |MID_DT_JK ; - j++; + dma[j++] =0 ; } here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1 );if (!eff) size += skip;
@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,if (size != eff) { dma[j++] = (here <<MID_DMA_COUNT_SHIFT ) | (vcc->vci <<MID_DMA_VCI_SHIFT ) |MID_DT_JK ; - j++; + dma[j++] =0 ; }if (!j || j >2 *RX_DMA_BUF ) { printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n");
drivers/char/ttyprintk.c +9 -6
@@ -18,10 +18,11 @@#include <linux/serial.h> #include <linux/tty.h> #include <linux/module.h> +#include <linux/spinlock.h> struct ttyprintk_port {struct tty_port port; -struct mutex port_write_mutex; +spinlock_t spinlock; };static struct ttyprintk_port tpk_port;
@@ -107,11 +108,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp)static void tpk_close (struct tty_struct *tty,struct file *filp) {struct ttyprintk_port *tpkp = tty->driver_data; +unsigned long flags; -mutex_lock (&tpkp->port_write_mutex); +spin_lock_irqsave (&tpkp->spinlock, flags);/* flush tpk_printk buffer */ tpk_printk (NULL ,0 ); -mutex_unlock (&tpkp->port_write_mutex); +spin_unlock_irqrestore (&tpkp->spinlock, flags);tty_port_close (&tpkp->port, tty, filp); }
@@ -123,13 +125,14 @@ static int tpk_write(struct tty_struct *tty, const unsigned char *buf, int count) {struct ttyprintk_port *tpkp = tty->driver_data; +unsigned long flags;int ret;/* exclusive use of tpk_printk within this tty */ -mutex_lock (&tpkp->port_write_mutex); +spin_lock_irqsave (&tpkp->spinlock, flags); ret =tpk_printk (buf, count); -mutex_unlock (&tpkp->port_write_mutex); +spin_unlock_irqrestore (&tpkp->spinlock, flags);return ret; }
@@ -179,7 +182,7 @@ static int __init ttyprintk_init(void) {int ret = -ENOMEM ; -mutex_init (&tpk_port.port_write_mutex); +spin_lock_init (&tpk_port.spinlock); ttyprintk_driver = tty_alloc_driver(1, TTY_DRIVER_RESET_TERMIOS |
drivers/clk/mmp/clk-of-mmp2.c +1 -1
@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock);static const char *ssp_parent_names[] = {"vctcxo_4" ,"vctcxo_2" ,"vctcxo" ,"pll1_16" };static DEFINE_SPINLOCK (timer_lock); -static const char *timer_parent_names[] = {"clk32" ,"vctcxo_2" ,"vctcxo_4" ,"vctcxo" }; +static const char *timer_parent_names[] = {"clk32" ,"vctcxo_4" ,"vctcxo_2" ,"vctcxo" };static DEFINE_SPINLOCK (reset_lock);
drivers/media/radio/si470x/radio-si470x-i2c.c +1 -1
@@ -458,10 +458,10 @@ static int si470x_i2c_remove(struct i2c_client *client)free_irq (client->irq, radio);video_unregister_device (&radio->videodev); -kfree (radio);v4l2_ctrl_handler_free (&radio->hdl);v4l2_device_unregister (&radio->v4l2_dev); +kfree (radio);return 0 ; }
drivers/media/usb/dvb-usb/digitv.c +7 -3
@@ -226,18 +226,22 @@ static struct rc_map_table rc_map_digitv_table[] = {static int digitv_rc_query (struct dvb_usb_device *d,u32 *event,int *state) { -int i; +int ret, i;u8 key[5 ];u8 b[4 ] = {0 }; *event =0 ; *state =REMOTE_NO_KEY_PRESSED ; -digitv_ctrl_msg (d,USB_READ_REMOTE ,0 ,NULL ,0 ,&key[1 ],4 ); + ret =digitv_ctrl_msg (d,USB_READ_REMOTE ,0 ,NULL ,0 , &key[1 ],4 ); +if (ret) +return ret;/* Tell the device we've read the remote. Not sure how necessary this is, but the Nebula SDK does it. */ -digitv_ctrl_msg (d,USB_WRITE_REMOTE ,0 ,b,4 ,NULL ,0 ); + ret =digitv_ctrl_msg (d,USB_WRITE_REMOTE ,0 , b,4 ,NULL ,0 ); +if (ret) +return ret;/* if something is inside the buffer, simulate key press */ if (key[1 ] !=0 )
drivers/media/usb/dvb-usb/dvb-usb-urb.c +1 -1
@@ -11,7 +11,7 @@int dvb_usb_generic_rw (struct dvb_usb_device *d,u8 *wbuf,u16 wlen,u8 *rbuf,u16 rlen,int delay_ms) { -int actlen,ret = -ENOMEM ; +int actlen =0 , ret = -ENOMEM ;if (!d || wbuf ==NULL || wlen ==0 )return -EINVAL ;
drivers/media/usb/gspca/gspca.c +1 -1
@@ -2028,7 +2028,7 @@ int gspca_dev_probe2(struct usb_interface *intf,pr_err ("couldn't kzalloc gspca struct\n" );return -ENOMEM ; } - gspca_dev->usb_buf =kmalloc (USB_BUF_SZ ,GFP_KERNEL ); + gspca_dev->usb_buf =kzalloc (USB_BUF_SZ ,GFP_KERNEL );if (!gspca_dev->usb_buf) {pr_err ("out of memory\n" ); ret = -ENOMEM ;
drivers/net/ethernet/broadcom/b44.c +6 -3
@@ -1524,8 +1524,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)int ethaddr_bytes =ETH_ALEN ;memset (ppattern + offset,0xff , magicsync); -for (j =0 ; j < magicsync; j++) -set_bit (len++, (unsigned long *) pmask); +for (j =0 ; j < magicsync; j++) { + pmask[len >>3 ] |=BIT (len &7 ); + len++; + }for (j =0 ; j <B44_MAX_PATTERNS ; j++) {if ((B44_PATTERN_SIZE - len) >=ETH_ALEN )
@@ -1537,7 +1539,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)for (k =0 ; k< ethaddr_bytes; k++) { ppattern[offset + magicsync + (j *ETH_ALEN ) + k] = macaddr[k]; -set_bit (len++, (unsigned long *) pmask); + pmask[len >>3 ] |=BIT (len &7 ); + len++; } }return len -1 ;
drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +1 -2
@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos)static void *seq_tab_next (struct seq_file *seq,void *v,loff_t *pos) { v =seq_tab_get_idx (seq->private, *pos +1 ); -if (v) - ++*pos; + ++(*pos);return v; }
drivers/net/ethernet/chelsio/cxgb4/l2t.c +1 -2
@@ -604,8 +604,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos)static void *l2t_seq_next (struct seq_file *seq,void *v,loff_t *pos) { v =l2t_get_idx (seq, *pos); -if (v) - ++*pos; + ++(*pos);return v; }
drivers/net/ethernet/freescale/xgmac_mdio.c +6 -1
@@ -49,6 +49,7 @@ struct tgec_mdio_controller {struct mdio_fsl_priv {struct tgec_mdio_controller __iomem *mdio_base;bool is_little_endian; +bool has_a011043; }; static u32 xgmac_read32(void __iomem *regs,
@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)return ret;/* Return all Fs if nothing was there */ -if (xgmac_read32 (®s->mdio_stat, endian) &MDIO_STAT_RD_ER ) { +if ((xgmac_read32 (®s->mdio_stat, endian) &MDIO_STAT_RD_ER ) && + !priv->has_a011043) {dev_err (&bus->dev,"Error while reading PHY%d reg at %d.%hhu\n" , phy_id, dev_addr, regnum);
@@ -277,6 +279,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev)else priv->is_little_endian = false; + priv->has_a011043 =of_property_read_bool (pdev->dev.of_node, +"fsl,erratum-a011043" ); + ret =of_mdiobus_register (bus, np);if (ret) {dev_err (&pdev->dev,"cannot register MDIO bus\n" );
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +27 -10
@@ -4532,7 +4532,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)struct ixgbe_hw *hw = &adapter->hw;struct hlist_node *node2;struct ixgbe_fdir_filter *filter; -u64 action; +u8 queue;spin_lock (&adapter->fdir_perfect_lock);
@@ -4541,17 +4541,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)hlist_for_each_entry_safe (filter, node2, &adapter->fdir_filter_list, fdir_node) { - action = filter->action; -if (action !=IXGBE_FDIR_DROP_QUEUE && action !=0 ) - action = - (action >>ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF ) -1 ; +if (filter->action ==IXGBE_FDIR_DROP_QUEUE ) { + queue =IXGBE_FDIR_DROP_QUEUE ; + }else { +u32 ring =ethtool_get_flow_spec_ring (filter->action); +u8 vf =ethtool_get_flow_spec_ring_vf (filter->action); + +if (!vf && (ring >= adapter->num_rx_queues)) { +e_err (drv,"FDIR restore failed without VF, ring: %u\n" , + ring); +continue ; + }else if (vf && + ((vf > adapter->num_vfs) || + ring >= adapter->num_rx_queues_per_pool)) { +e_err (drv,"FDIR restore failed with VF, vf: %hhu, ring: %u\n" , + vf, ring); +continue ; + } + +/* Map the ring onto the absolute queue index */ +if (!vf) + queue = adapter->rx_ring[ring]->reg_idx; +else + queue = ((vf -1 ) * + adapter->num_rx_queues_per_pool) + ring; + }ixgbe_fdir_write_perfect_filter_82599 (hw, - &filter->filter, - filter->sw_idx, - (action ==IXGBE_FDIR_DROP_QUEUE ) ? -IXGBE_FDIR_DROP_QUEUE : - adapter->rx_ring[action]->reg_idx); + &filter->filter, filter->sw_idx, queue); }spin_unlock (&adapter->fdir_perfect_lock);
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +0 -5
@@ -1861,11 +1861,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev)struct ixgbe_hw *hw = &adapter->hw;int count =0 ; -if ((netdev_uc_count (netdev)) >10 ) { -pr_err ("Too many unicast filters - No Space\n" ); -return -ENOSPC ; - } -if (!netdev_uc_empty (netdev)) {struct netdev_hw_addr *ha;
drivers/net/ethernet/natsemi/sonic.c +90 -19
213 lines not on this page · raw message
drivers/net/ethernet/natsemi/sonic.h +15 -10
@@ -109,6 +109,9 @@#define SONIC_CR_TXP 0x0002#define SONIC_CR_HTX 0x0001 +#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ + SONIC_CR_RXEN | SONIC_CR_TXP) +/* * SONIC data configuration bits */
@@ -273,8 +276,9 @@#define SONIC_NUM_RDS SONIC_NUM_RRS/* number of receive descriptors */ #define SONIC_NUM_TDS 16/* number of transmit descriptors */ -#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) -#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) +#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) +#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) +#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1)#define SONIC_RBSIZE 1520/* size of one resource buffer */
@@ -320,6 +324,7 @@ struct sonic_local {unsigned int next_tx;/* next free TD */ struct device *device;/* generic device */ struct net_device_stats stats; +spinlock_t lock; };#define TX_TIMEOUT (3 * HZ)
@@ -341,30 +346,30 @@ static void sonic_tx_timeout(struct net_device *dev);as far as we can tell. */ /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() is a much better name. */ -static inline void sonic_buf_put (void * base,int bitmode, +static inline void sonic_buf_put (u16 *base,int bitmode,int offset,__u16 val) { if (bitmode)#ifdef __BIG_ENDIAN - ((__u16 *) base + (offset*2 ))[1 ] = val; +__raw_writew (val, base + (offset *2 ) +1 );#else - ((__u16 *) base + (offset*2 ))[0 ] = val; +__raw_writew (val, base + (offset *2 ) +0 );#endif else - ((__u16 *) base)[offset] = val; + __raw_writew(val, base + (offset * 1) + 0); } -static inline __u16 sonic_buf_get (void * base,int bitmode, +static inline __u16 sonic_buf_get (u16 *base,int bitmode,int offset) { if (bitmode)#ifdef __BIG_ENDIAN -return ((volatile __u16 *) base + (offset*2 ))[1 ]; +return __raw_readw (base + (offset *2 ) +1 );#else -return ((volatile __u16 *) base + (offset*2 ))[0 ]; +return __raw_readw (base + (offset *2 ) +0 );#endif else - return ((volatile __u16 *) base)[offset]; + return __raw_readw(base + (offset * 1) + 0); }/* Inlines that you should actually use for reading/writing DMA buffers */
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +1 -0
@@ -2047,6 +2047,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,break ; } entry += p_hdr->size; +cond_resched (); } p_dev->ahw->reset.seq_index = index; }
drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +2 -0
@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, addr +=16 ; reg_read -=16 ; ret +=16 ; +cond_resched (); } out:mutex_unlock (&adapter->ahw->mem_lock);
@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) buf_offset += entry->hdr.cap_size; entry_offset += entry->hdr.offset; buffer = fw_dump->data + buf_offset; +cond_resched (); } fw_dump->clr =1 ;
drivers/net/usb/r8152.c +5 -4
@@ -4313,6 +4313,11 @@ static int rtl8152_probe(struct usb_interface *intf, intf->needs_remote_wakeup =1 ; +if (!rtl_can_wakeup (tp)) +__rtl_set_wol (tp,0 ); +else + tp->saved_wolopts =__rtl_get_wol (tp); + tp->rtl_ops.init (tp);set_ethernet_addr (tp);
@@ -4325,10 +4330,6 @@ static int rtl8152_probe(struct usb_interface *intf, goto out1; } -if (!rtl_can_wakeup (tp)) -__rtl_set_wol (tp,0 ); - - tp->saved_wolopts =__rtl_get_wol (tp);if (tp->saved_wolopts)device_set_wakeup_enable (&udev->dev, true);else
drivers/net/wan/sdla.c +1 -1
@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb,spin_lock_irqsave (&sdla_lock, flags);SDLA_WINDOW (dev, addr); - pbuf = (void *)(((int ) dev->mem_start) + (addr &SDLA_ADDR_MASK )); + pbuf = (void *)(dev->mem_start + (addr &SDLA_ADDR_MASK ));__sdla_write (dev, pbuf->buf_addr, skb->data, skb->len);SDLA_WINDOW (dev, addr); pbuf->opp_flag =1 ;
drivers/net/wireless/airo.c +9 -11
@@ -7808,16 +7808,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {case AIROGVLIST : ridcode =RID_APLIST ;break ;case AIROGDRVNAM : ridcode =RID_DRVNAME ;break ;case AIROGEHTENC : ridcode =RID_ETHERENCAP ;break ; -case AIROGWEPKTMP : ridcode =RID_WEP_TEMP ; -/* Only super-user can read WEP keys */ -if (!capable (CAP_NET_ADMIN )) -return -EPERM ; -break ; -case AIROGWEPKNV : ridcode =RID_WEP_PERM ; -/* Only super-user can read WEP keys */ -if (!capable (CAP_NET_ADMIN )) -return -EPERM ; -break ; +case AIROGWEPKTMP : ridcode =RID_WEP_TEMP ;break ; +case AIROGWEPKNV : ridcode =RID_WEP_PERM ;break ;case AIROGSTAT : ridcode =RID_STATUS ;break ;case AIROGSTATSD32 : ridcode =RID_STATSDELTA ;break ;case AIROGSTATSC32 : ridcode =RID_STATS ;break ;
@@ -7831,7 +7823,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {return -EINVAL ; } -if ((iobuf =kmalloc (RIDSIZE ,GFP_KERNEL )) ==NULL ) +if (ridcode ==RID_WEP_TEMP || ridcode ==RID_WEP_PERM ) { +/* Only super-user can read WEP keys */ +if (!capable (CAP_NET_ADMIN )) +return -EPERM ; + } + +if ((iobuf =kzalloc (RIDSIZE ,GFP_KERNEL )) ==NULL )return -ENOMEM ;PC4500_readrid (ai,ridcode,iobuf,RIDSIZE ,1 );
drivers/net/wireless/ath/ath9k/hif_usb.c +1 -1
@@ -1211,7 +1211,7 @@ err_fw:static int send_eject_command (struct usb_interface *interface) {struct usb_device *udev =interface_to_usbdev (interface); -struct usb_host_interface *iface_desc = &interface->altsetting[0 ]; +struct usb_host_interface *iface_desc = interface->cur_altsetting;struct usb_endpoint_descriptor *endpoint;unsigned char *cmd;u8 bulk_out_ep;
drivers/net/wireless/brcm80211/brcmfmac/usb.c +2 -2
@@ -1352,7 +1352,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) goto fail; } - desc = &intf->altsetting[0 ].desc; + desc = &intf->cur_altsetting->desc;if ((desc->bInterfaceClass !=USB_CLASS_VENDOR_SPEC ) || (desc->bInterfaceSubClass !=2 ) || (desc->bInterfaceProtocol !=0xff )) {
@@ -1365,7 +1365,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) num_of_eps = desc->bNumEndpoints;for (ep =0 ; ep < num_of_eps; ep++) { - endpoint = &intf->altsetting[0 ].endpoint[ep].desc; + endpoint = &intf->cur_altsetting->endpoint[ep].desc; endpoint_num =usb_endpoint_num (endpoint);if (!usb_endpoint_xfer_bulk (endpoint))continue ;
drivers/net/wireless/orinoco/orinoco_usb.c +2 -2
@@ -1601,9 +1601,9 @@ static int ezusb_probe(struct usb_interface *interface,/* set up the endpoint information */ /* check out the endpoints */ - iface_desc = &interface->altsetting[0 ].desc; + iface_desc = &interface->cur_altsetting->desc;for (i =0 ; i < iface_desc->bNumEndpoints; ++i) { - ep = &interface->altsetting[0 ].endpoint[i].desc; + ep = &interface->cur_altsetting->endpoint[i].desc;if (usb_endpoint_is_bulk_in (ep)) {/* we found a bulk in endpoint */
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +1 -1
@@ -5555,7 +5555,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,u8 dir, xtype, num;int ret =0 ; - host_interface = &interface->altsetting[0 ]; + host_interface = interface->cur_altsetting; interface_desc = &host_interface->desc; endpoints = interface_desc->bNumEndpoints;
drivers/net/wireless/rsi/rsi_91x_usb.c +1 -1
@@ -103,7 +103,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,__le16 buffer_size;int ii, bep_found =0 ; - iface_desc = &(interface->altsetting[0 ]); + iface_desc = interface->cur_altsetting;for (ii =0 ; ii < iface_desc->desc.bNumEndpoints; ++ii) { endpoint = &(iface_desc->endpoint[ii].desc);
drivers/net/wireless/zd1211rw/zd_usb.c +1 -1
@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev)static int eject_installer (struct usb_interface *intf) {struct usb_device *udev =interface_to_usbdev (intf); -struct usb_host_interface *iface_desc = &intf->altsetting[0 ]; +struct usb_host_interface *iface_desc = intf->cur_altsetting;struct usb_endpoint_descriptor *endpoint;unsigned char *cmd;u8 bulk_out_ep;
drivers/scsi/fnic/fnic_scsi.c +3 -0
@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_if (unlikely (fnic_chk_state_flags_locked (fnic,FNIC_FLAGS_IO_BLOCKED )))return SCSI_MLQUEUE_HOST_BUSY ; +if (unlikely (fnic_chk_state_flags_locked (fnic,FNIC_FLAGS_FWRESET ))) +return SCSI_MLQUEUE_HOST_BUSY ; + rport =starget_to_rport (scsi_target (sc->device)); ret =fc_remote_port_chkready (rport);if (ret) {
drivers/staging/most/aim-network/networking.c +10 -0
@@ -87,6 +87,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo)unsigned int payload_len = skb->len -ETH_HLEN ;unsigned int mdp_len = payload_len +MDP_HDR_LEN ; +if (mdp_len < skb->len) { +pr_err ("drop: too large packet! (%u)\n" , skb->len); +return -EINVAL ; + } +if (mbo->buffer_length < mdp_len) {pr_err ("drop: too small buffer! (%d for %d)\n" , mbo->buffer_length, mdp_len);
@@ -134,6 +139,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo)u8 *buff = mbo->virt_address;unsigned int mep_len = skb->len +MEP_HDR_LEN ; +if (mep_len < skb->len) { +pr_err ("drop: too large packet! (%u)\n" , skb->len); +return -EINVAL ; + } +if (mbo->buffer_length < mep_len) {pr_err ("drop: too small buffer! (%d for %d)\n" , mbo->buffer_length, mep_len);
drivers/staging/vt6656/device.h +2 -0
@@ -65,6 +65,8 @@#define RATE_AUTO 12#define MAX_RATE 12 +#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ + BIT(RATE_5M) | BIT(RATE_11M))/* * device specific
drivers/staging/vt6656/int.c +4 -2
@@ -111,9 +111,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) info->status.rates[0 ].count = tx_retry; -if (!(tsr & (TSR_TMO |TSR_RETRYTMO ))) { +if (!(tsr &TSR_TMO )) { info->status.rates[0 ].idx = idx; - info->flags |=IEEE80211_TX_STAT_ACK ; + +if (!(info->flags &IEEE80211_TX_CTL_NO_ACK )) + info->flags |=IEEE80211_TX_STAT_ACK ; }ieee80211_tx_status_irqsafe (priv->hw, context->skb);
drivers/staging/vt6656/main_usb.c +1 -0
@@ -1002,6 +1002,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)ieee80211_hw_set (priv->hw,RX_INCLUDES_FCS );ieee80211_hw_set (priv->hw,REPORTS_TX_ACK_STATUS );ieee80211_hw_set (priv->hw,SUPPORTS_PS ); +ieee80211_hw_set (priv->hw,PS_NULLFUNC_STACK ); priv->hw->max_signal =100 ;
drivers/staging/vt6656/rxtx.c +13 -13
@@ -280,11 +280,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, PK_TYPE_11B, &buf->b);/* Get Duration and TimeStamp */ -if (ieee80211_is_pspoll (hdr->frame_control)) { -__le16 dur =cpu_to_le16 (priv->current_aid |BIT (14 ) |BIT (15 )); - - buf->duration_a = dur; - buf->duration_b = dur; +if (ieee80211_is_nullfunc (hdr->frame_control)) { + buf->duration_a = hdr->duration_id; + buf->duration_b = hdr->duration_id; }else { buf->duration_a =vnt_get_duration_le (priv, tx_context->pkt_type, need_ack);
@@ -373,10 +371,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, tx_context->pkt_type, &buf->ab);/* Get Duration and TimeStampOff */ -if (ieee80211_is_pspoll (hdr->frame_control)) { -__le16 dur =cpu_to_le16 (priv->current_aid |BIT (14 ) |BIT (15 )); - - buf->duration = dur; +if (ieee80211_is_nullfunc (hdr->frame_control)) { + buf->duration = hdr->duration_id; }else { buf->duration =vnt_get_duration_le (priv, tx_context->pkt_type, need_ack);
@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)if (info->band ==IEEE80211_BAND_5GHZ ) { pkt_type =PK_TYPE_11A ; }else { -if (tx_rate->flags &IEEE80211_TX_RC_USE_CTS_PROTECT ) - pkt_type =PK_TYPE_11GB ; -else - pkt_type =PK_TYPE_11GA ; +if (tx_rate->flags &IEEE80211_TX_RC_USE_CTS_PROTECT ) { +if (priv->basic_rates &VNT_B_RATES ) + pkt_type =PK_TYPE_11GB ; +else + pkt_type =PK_TYPE_11GA ; + }else { + pkt_type =PK_TYPE_11A ; + } } }else { pkt_type =PK_TYPE_11B ;
drivers/staging/wlan-ng/prism2mgmt.c +1 -1
@@ -940,7 +940,7 @@ int prism2mgmt_flashdl_state(wlandevice_t *wlandev, void *msgp) } } -return 0 ; +return result; }/*----------------------------------------------------------------
drivers/usb/dwc3/core.c +3 -0
@@ -801,6 +801,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)/* do nothing */ break ; } + +/* de-assert DRVVBUS for HOST and OTG mode */ +dwc3_set_mode (dwc,DWC3_GCTL_PRTCAP_DEVICE ); }#define DWC3_ALIGN_MASK (16 - 1)
drivers/usb/serial/ir-usb.c +104 -32
196 lines not on this page · raw message
drivers/usb/storage/unusual_uas.h +5 -2
@@ -162,12 +162,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_IGNORE_UAS), -/* Reported-by: Takeo Nakayama <[email protected]> */ +/* +* Initially Reported-by: Takeo Nakayama <[email protected]> +* UAS Ignore Reported by Steven Ellis <[email protected]> +*/ UNUSUAL_DEV (0x357d ,0x7788 ,0x0000 ,0x9999 ,"JMicron" ,"JMS566" ,USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , -US_FL_NO_REPORT_OPCODES ), +US_FL_NO_REPORT_OPCODES |US_FL_IGNORE_UAS ),/* Reported-by: Hans de Goede <[email protected]> */ UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
drivers/watchdog/rn5t618_wdt.c +1 -0
@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = {module_platform_driver (rn5t618_wdt_driver); +MODULE_ALIAS ("platform:rn5t618-wdt" );MODULE_AUTHOR ("Beniamino Galvani <[email protected]>" );MODULE_DESCRIPTION ("RN5T618 watchdog driver" );MODULE_LICENSE ("GPL v2" );
fs/btrfs/super.c +21 -3
@@ -1978,6 +1978,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;int ret;u64 thresh =0 ; +int mixed =0 ;/* * holding chunk_muext to avoid allocating new chunks, holding
@@ -2003,8 +2004,17 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) } } } -if (found->flags &BTRFS_BLOCK_GROUP_METADATA ) - total_free_meta += found->disk_total - found->disk_used; + +/* +* Metadata in mixed block goup profiles are accounted in data +*/ +if (!mixed && found->flags &BTRFS_BLOCK_GROUP_METADATA ) { +if (found->flags &BTRFS_BLOCK_GROUP_DATA ) + mixed =1 ; +else + total_free_meta += found->disk_total - + found->disk_used; + } total_used += found->disk_used; }
@@ -2042,7 +2052,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)*/ thresh =4 *1024 *1024 ; -if (total_free_meta - thresh < block_rsv->size) +/* +* We only want to claim there's no available space if we can no longer +* allocate chunks for our metadata profile and our global reserve will +* not fit in the free metadata space. If we aren't ->full then we +* still can allocate chunks and thus are fine using the currently +* calculated f_bavail. +*/ +if (!mixed && block_rsv->space_info->full && + total_free_meta - thresh < block_rsv->size) buf->f_bavail =0 ; buf->f_type =BTRFS_SUPER_MAGIC ;
fs/namei.c +2 -2
@@ -3060,8 +3060,8 @@ static int do_last(struct nameidata *nd, int *opened) {struct dentry *dir = nd->path.dentry; -kuid_t dir_uid = dir->d_inode->i_uid; -umode_t dir_mode = dir->d_inode->i_mode; +kuid_t dir_uid = nd->inode->i_uid; +umode_t dir_mode = nd->inode->i_mode;int open_flag = op->open_flag;bool will_truncate = (open_flag &O_TRUNC ) !=0 ;bool got_write = false;
fs/reiserfs/super.c +2 -0
@@ -599,6 +599,7 @@ static void reiserfs_put_super(struct super_block *s)reiserfs_write_unlock (s);mutex_destroy (&REISERFS_SB (s)->lock);destroy_workqueue (REISERFS_SB (s)->commit_wq); +kfree (REISERFS_SB (s)->s_jdev);kfree (s->s_fs_info); s->s_fs_info =NULL ; }
@@ -2208,6 +2209,7 @@ error_unlocked: kfree(qf_names[j]); }#endif +kfree (sbi->s_jdev);kfree (sbi); s->s_fs_info =NULL ;
include/linux/usb/irda.h +12 -1
@@ -118,11 +118,22 @@ struct usb_irda_cs_descriptor {* 6 - 115200 bps * 7 - 576000 bps * 8 - 1.152 Mbps -* 9 - 5 mbps +* 9 - 4 Mbps * 10..15 - Reserved */ #define USB_IRDA_STATUS_LINK_SPEED 0x0f +#define USB_IRDA_LS_NO_CHANGE 0 +#define USB_IRDA_LS_2400 1 +#define USB_IRDA_LS_9600 2 +#define USB_IRDA_LS_19200 3 +#define USB_IRDA_LS_38400 4 +#define USB_IRDA_LS_57600 5 +#define USB_IRDA_LS_115200 6 +#define USB_IRDA_LS_576000 7 +#define USB_IRDA_LS_1152000 8 +#define USB_IRDA_LS_4000000 9 +/* The following is a 4-bit value used only for * outbound header: *
mm/mempolicy.c +3 -3
@@ -2701,6 +2701,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)char *flags =strchr (str,'=' );int err =1 ; +if (flags) + *flags++ ='\0' ;/* terminate mode string */ +if (nodelist) {/* NUL-terminate mode or flags string */ *nodelist++ ='\0' ;
@@ -2711,9 +2714,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) }else nodes_clear (nodes); -if (flags) - *flags++ ='\0' ;/* terminate mode string */ -for (mode =0 ; mode <MPOL_MAX ; mode++) {if (!strcmp (str, policy_modes[mode])) {break ;
net/core/utils.c +17 -3
@@ -316,6 +316,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, }EXPORT_SYMBOL (inet_proto_csum_replace4); +/** +* inet_proto_csum_replace16 - update layer 4 header checksum field +* @sum: Layer 4 header checksum field +* @skb: sk_buff for the packet +* @from: old IPv6 address +* @to: new IPv6 address +* @pseudohdr: True if layer 4 header checksum includes pseudoheader +* +* Update layer 4 header as per the update in IPv6 src/dst address. +* +* There is no need to update skb->csum in this function, because update in two +* fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other +* for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to +* update skb->csum, because update in 3 fields a.) IPv4 src/dst address, +* b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as +* L4 Header checksum for skb->csum calculation. +*/ void inet_proto_csum_replace16 (__sum16 *sum,struct sk_buff *skb,const __be32 *from,const __be32 *to,bool pseudohdr)
@@ -327,9 +344,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,if (skb->ip_summed !=CHECKSUM_PARTIAL ) { *sum =csum_fold (csum_partial (diff,sizeof (diff), ~csum_unfold (*sum))); -if (skb->ip_summed ==CHECKSUM_COMPLETE && pseudohdr) - skb->csum = ~csum_partial (diff,sizeof (diff), - ~skb->csum); }else if (pseudohdr) *sum = ~csum_fold (csum_partial (diff,sizeof (diff),csum_unfold (*sum)));
net/ipv4/ip_vti.c +11 -2
@@ -195,8 +195,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,int err;if (!dst) { - dev->stats.tx_carrier_errors++; - goto tx_error_icmp; +struct rtable *rt; + + fl->u.ip4.flowi4_oif = dev->ifindex; + fl->u.ip4.flowi4_flags |=FLOWI_FLAG_ANYSRC ; + rt =__ip_route_output_key (dev_net (dev), &fl->u.ip4); +if (IS_ERR (rt)) { + dev->stats.tx_carrier_errors++; + goto tx_error_icmp; + } + dst = &rt->dst; +skb_dst_set (skb, dst); }dst_hold (dst);
net/ipv6/ip6_vti.c +11 -2
@@ -441,8 +441,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)int err =-1 ;int mtu; -if (!dst) - goto tx_err_link_failure; +if (!dst) { + fl->u.ip6.flowi6_oif = dev->ifindex; + fl->u.ip6.flowi6_flags |=FLOWI_FLAG_ANYSRC ; + dst =ip6_route_output (dev_net (dev),NULL , &fl->u.ip6); +if (dst->error) { +dst_release (dst); + dst =NULL ; + goto tx_err_link_failure; + } +skb_dst_set (skb, dst); + }dst_hold (dst); dst =xfrm_lookup (t->net, dst, fl,NULL ,0 );
net/sched/ematch.c +3 -0
@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp, goto errout;if (em->ops->change) { + err = -EINVAL ; +if (em_hdr->flags &TCF_EM_SIMPLE ) + goto errout; err = em->ops->change (net, data, data_len, em);if (err <0 ) goto errout;
net/wireless/wext-core.c +2 -1
@@ -656,7 +656,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev)return NULL ; } -static int iw_handler_get_iwstats (struct net_device * dev, +/* noinline to avoid a bogus warning with -O3 */ +static noinline int iw_handler_get_iwstats(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)
sound/core/pcm_native.c +1 -1
@@ -588,7 +588,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, runtime->boundary *=2 ;/* clear the buffer for avoiding possible kernel info leaks */ -if (runtime->dma_area) +if (runtime->dma_area && !substream->ops->copy)memset (runtime->dma_area,0 , runtime->dma_bytes);snd_pcm_timer_resolution_change (substream);