The following commit has been merged in the master branch: commit ba76775ca7f647a588deded87998971d902485bf Merge: 1718cb174741d152f095d7b96d224838abb6b882 5c721d561dc6cded61e28425b30ca66aef09a14d Author: Stephen Rothwell sfr@canb.auug.org.au Date: Mon Jan 11 13:14:03 2016 +1100
Merge remote-tracking branch 'net-next/master'
diff --combined MAINTAINERS index c0bd912,74b84d4..d2b21c6 --- a/MAINTAINERS +++ b/MAINTAINERS @@@ -206,7 -206,7 +206,7 @@@ F: include/trace/events/9p. A8293 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -371,6 -371,15 +371,15 @@@ ADDRESS SPACE LAYOUT RANDOMIZATION (ASL M: Jiri Kosina jikos@kernel.org S: Maintained
+ ADF7242 IEEE 802.15.4 RADIO DRIVER + M: Michael Hennerich michael.hennerich@analog.com + W: https://wiki.analog.com/ADF7242 + W: http://ez.analog.com/community/linux-device-drivers + L: linux-wpan@vger.kernel.org + S: Supported + F: drivers/net/ieee802154/adf7242.c + F: Documentation/devicetree/bindings/net/ieee802154/adf7242.txt + ADM1025 HARDWARE MONITOR DRIVER M: Jean Delvare jdelvare@suse.com L: lm-sensors@lm-sensors.org @@@ -388,14 -397,14 +397,14 @@@ ADM8211 WIRELESS DRIVE L: linux-wireless@vger.kernel.org W: http://wireless.kernel.org/ S: Orphan - F: drivers/net/wireless/adm8211.* + F: drivers/net/wireless/admtek/adm8211.*
ADP1653 FLASH CONTROLLER DRIVER M: Sakari Ailus sakari.ailus@iki.fi L: linux-media@vger.kernel.org S: Maintained F: drivers/media/i2c/adp1653.c -F: include/media/adp1653.h +F: include/media/i2c/adp1653.h
ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) M: Michael Hennerich michael.hennerich@analog.com @@@ -466,7 -475,7 +475,7 @@@ F: sound/oss/aedsp16. AF9013 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -476,7 -485,7 +485,7 @@@ F: drivers/media/dvb-frontends/af9013 AF9033 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -522,7 -531,7 +531,7 @@@ AIMSLAB FM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-aimslab*
@@@ -536,7 -545,7 +545,7 @@@ F: include/linux/*aio*. AIRSPY MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -614,9 -623,9 +623,9 @@@ F: drivers/crypto/ccp F: include/linux/ccp.h
AMD FAM15H PROCESSOR POWER MONITORING DRIVER -M: Andreas Herrmann herrmann.der.user@googlemail.com +M: Huang Rui ray.huang@amd.com L: lm-sensors@lm-sensors.org -S: Maintained +S: Supported F: Documentation/hwmon/fam15h_power F: drivers/hwmon/fam15h_power.c
@@@ -1400,13 -1409,12 +1409,13 @@@ W: http://www.arm.linux.org.uk S: Maintained
ARM/QUALCOMM SUPPORT -M: Kumar Gala galak@codeaurora.org -M: Andy Gross agross@codeaurora.org -M: David Brown davidb@codeaurora.org +M: Andy Gross andy.gross@linaro.org +M: David Brown david.brown@linaro.org L: linux-arm-msm@vger.kernel.org L: linux-soc@vger.kernel.org S: Maintained +F: arch/arm/boot/dts/qcom-*.dts +F: arch/arm/boot/dts/qcom-*.dtsi F: arch/arm/mach-qcom/ F: drivers/soc/qcom/ F: drivers/tty/serial/msm_serial.h @@@ -1414,22 -1422,13 +1423,22 @@@ F: drivers/tty/serial/msm_serial. F: drivers/*/pm8???-* F: drivers/mfd/ssbi.c F: drivers/firmware/qcom_scm.c -T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux.git
ARM/RADISYS ENP2611 MACHINE SUPPORT M: Lennert Buytenhek kernel@wantstofly.org L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) S: Maintained
+ARM/RENESAS ARM64 ARCHITECTURE +M: Simon Horman horms@verge.net.au +M: Magnus Damm magnus.damm@gmail.com +L: linux-sh@vger.kernel.org +Q: http://patchwork.kernel.org/project/linux-sh/list/ +T: git git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git next +S: Supported +F: arch/arm64/boot/dts/renesas/ + ARM/RISCPC ARCHITECTURE M: Russell King linux@arm.linux.org.uk L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@@ -1527,6 -1526,7 +1536,6 @@@ ARM/SHMOBILE ARM ARCHITECTUR M: Simon Horman horms@verge.net.au M: Magnus Damm magnus.damm@gmail.com L: linux-sh@vger.kernel.org -W: http://oss.renesas.com Q: http://patchwork.kernel.org/project/linux-sh/list/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git next S: Supported @@@ -1597,13 -1597,6 +1606,13 @@@ T: git git://git.kernel.org/pub/scm/lin N: stm32 F: drivers/clocksource/armv7m_systick.c
+ARM/TANGO ARCHITECTURE +M: Marc Gonzalez marc_gonzalez@sigmadesigns.com +L: linux-arm-kernel@lists.infradead.org +S: Maintained +F: arch/arm/mach-tango/ +F: arch/arm/boot/dts/tango* + ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT M: Lennert Buytenhek kernel@wantstofly.org L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@@ -1658,8 -1651,6 +1667,8 @@@ F: arch/arm/boot/dts/uniphier F: arch/arm/include/asm/hardware/cache-uniphier.h F: arch/arm/mach-uniphier/ F: arch/arm/mm/cache-uniphier.c +F: arch/arm64/boot/dts/socionext/ +F: drivers/bus/uniphier-system-bus.c F: drivers/i2c/busses/i2c-uniphier* F: drivers/pinctrl/uniphier/ F: drivers/tty/serial/8250/8250_uniphier.c @@@ -1791,7 -1782,7 +1800,7 @@@ L: linux-media@vger.kernel.or T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/i2c/as3645a.c -F: include/media/as3645a.h +F: include/media/i2c/as3645a.h
ASC7621 HARDWARE MONITOR DRIVER M: George Joseph george.joseph@fairview5.com @@@ -2011,7 -2002,7 +2020,7 @@@ L: linux-wireless@vger.kernel.or W: http://www.thekelleys.org.uk/atmel W: http://atmelwlandriver.sourceforge.net/ S: Maintained - F: drivers/net/wireless/atmel* + F: drivers/net/wireless/atmel/atmel*
ATMEL MAXTOUCH DRIVER M: Nick Dyer nick.dyer@itdev.co.uk @@@ -2082,7 -2073,7 +2091,7 @@@ F: net/ax25 AZ6007 DVB DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/usb/dvb-usb-v2/az6007.c @@@ -2091,7 -2082,7 +2100,7 @@@ AZTECH FM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-aztech*
@@@ -2100,7 -2091,7 +2109,7 @@@ L: linux-wireless@vger.kernel.or L: b43-dev@lists.infradead.org W: http://wireless.kernel.org/en/users/Drivers/b43 S: Odd Fixes - F: drivers/net/wireless/b43/ + F: drivers/net/wireless/broadcom/b43/
B43LEGACY WIRELESS DRIVER M: Larry Finger Larry.Finger@lwfinger.net @@@ -2108,7 -2099,7 +2117,7 @@@ L: linux-wireless@vger.kernel.or L: b43-dev@lists.infradead.org W: http://wireless.kernel.org/en/users/Drivers/b43 S: Maintained - F: drivers/net/wireless/b43legacy/ + F: drivers/net/wireless/broadcom/b43legacy/
BACKLIGHT CLASS/SUBSYSTEM M: Jingoo Han jingoohan1@gmail.com @@@ -2120,7 -2111,7 +2129,7 @@@ F: include/linux/backlight. BATMAN ADVANCED M: Marek Lindner mareklindner@neomailbox.ch M: Simon Wunderlich sw@simonwunderlich.de - M: Antonio Quartulli antonio@meshcoding.com + M: Antonio Quartulli a@unstable.cc L: b.a.t.m.a.n@lists.open-mesh.org W: http://www.open-mesh.org/ S: Maintained @@@ -2144,7 -2135,7 +2153,7 @@@ BDISP ST MEDIA DRIVE M: Fabien Dessenne fabien.dessenne@st.com L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Supported F: drivers/media/platform/sti/bdisp
@@@ -2375,7 -2366,6 +2384,7 @@@ M: Brian Norris <computersforpeace@gmai M: Gregory Fong gregory.0xf0@gmail.com M: Florian Fainelli f.fainelli@gmail.com L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +L: bcm-kernel-feedback-list@broadcom.com T: git git://github.com/broadcom/stblinux.git S: Maintained F: arch/arm/mach-bcm/*brcmstb* @@@ -2411,7 -2401,7 +2420,7 @@@ M: Hante Meuleman <meuleman@broadcom.co L: linux-wireless@vger.kernel.org L: brcm80211-dev-list@broadcom.com S: Supported - F: drivers/net/wireless/brcm80211/ + F: drivers/net/wireless/broadcom/brcm80211/
BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER M: QLogic-Storage-Upstream@qlogic.com @@@ -2449,7 -2439,7 +2458,7 @@@ N: bcm8831
BROADCOM BRCMSTB GPIO DRIVER M: Gregory Fong gregory.0xf0@gmail.com -L: bcm-kernel-feedback-list@broadcom.com> +L: bcm-kernel-feedback-list@broadcom.com S: Supported F: drivers/gpio/gpio-brcmstb.c F: Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.txt @@@ -2538,7 -2528,7 +2547,7 @@@ F: fs/btrfs BTTV VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: Documentation/video4linux/bttv/ @@@ -2577,7 -2567,7 +2586,7 @@@ CADET FM/AM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-cadet*
@@@ -2870,7 -2860,7 +2879,7 @@@ COBALT MEDIA DRIVE M: Hans Verkuil hans.verkuil@cisco.com L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Supported F: drivers/media/pci/cobalt/
@@@ -2958,8 -2948,7 +2967,8 @@@ F: drivers/usb/atm/cxacru.
CONFIGFS M: Joel Becker jlbec@evilplan.org -T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/configfs.git +M: Christoph Hellwig hch@lst.de +T: git git://git.infradead.org/users/hch/configfs.git S: Supported F: fs/configfs/ F: include/linux/configfs.h @@@ -3116,15 -3105,6 +3125,15 @@@ S: Maintaine F: crypto/ansi_cprng.c F: crypto/rng.c
+CS3308 MEDIA DRIVER +M: Hans Verkuil hverkuil@xs4all.nl +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +W: http://linuxtv.org +S: Odd Fixes +F: drivers/media/i2c/cs3308.c +F: drivers/media/i2c/cs3308.h + CS5535 Audio ALSA driver M: Jaya Kumar jayakumar.alsa@gmail.com S: Maintained @@@ -3133,14 -3113,14 +3142,14 @@@ F: sound/pci/cs5535audio CW1200 WLAN driver M: Solomon Peachy pizza@shaftnet.org S: Maintained - F: drivers/net/wireless/cw1200/ + F: drivers/net/wireless/st/cw1200/
CX18 VIDEO4LINUX DRIVER M: Andy Walls awalls@md.metrocast.net L: ivtv-devel@ivtvdriver.org (subscribers-only) L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org W: http://www.ivtvdriver.org/index.php/Cx18 S: Maintained F: Documentation/video4linux/cx18.txt @@@ -3151,7 -3131,7 +3160,7 @@@ CX2341X MPEG ENCODER HELPER MODUL M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/common/cx2341x* F: include/media/cx2341x* @@@ -3160,7 -3140,7 +3169,7 @@@ CX24120 MEDIA DRIVE M: Jemma Denson jdenson@gmail.com M: Patrick Boettcher patrick.boettcher@posteo.de L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ S: Maintained F: drivers/media/dvb-frontends/cx24120* @@@ -3168,7 -3148,7 +3177,7 @@@ CX88 VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: Documentation/video4linux/cx88/ @@@ -3177,7 -3157,7 +3186,7 @@@ F: drivers/media/pci/cx88 CXD2820R MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3283,7 -3263,7 +3292,7 @@@ F: drivers/net/wan/pc300 CYPRESS_FIRMWARE MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3790,14 -3770,14 +3799,14 @@@ DT3155 MEDIA DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/pci/dt3155/
DVB_USB_AF9015 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3807,7 -3787,7 +3816,7 @@@ F: drivers/media/usb/dvb-usb-v2/af9015 DVB_USB_AF9035 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3817,7 -3797,7 +3826,7 @@@ F: drivers/media/usb/dvb-usb-v2/af9035 DVB_USB_ANYSEE MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3827,7 -3807,7 +3836,7 @@@ F: drivers/media/usb/dvb-usb-v2/anysee DVB_USB_AU6610 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3837,7 -3817,7 +3846,7 @@@ F: drivers/media/usb/dvb-usb-v2/au6610 DVB_USB_CE6230 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3847,7 -3827,7 +3856,7 @@@ F: drivers/media/usb/dvb-usb-v2/ce6230 DVB_USB_CXUSB MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/media_tree.git @@@ -3857,7 -3837,7 +3866,7 @@@ F: drivers/media/usb/dvb-usb/cxusb DVB_USB_EC168 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3867,7 -3847,7 +3876,7 @@@ F: drivers/media/usb/dvb-usb-v2/ec168 DVB_USB_GL861 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git S: Maintained @@@ -3876,7 -3856,7 +3885,7 @@@ F: drivers/media/usb/dvb-usb-v2/gl861 DVB_USB_MXL111SF MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/mxl111sf.git @@@ -3886,7 -3866,7 +3895,7 @@@ F: drivers/media/usb/dvb-usb-v2/mxl111s DVB_USB_RTL28XXU MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3896,7 -3876,7 +3905,7 @@@ F: drivers/media/usb/dvb-usb-v2/rtl28xx DVB_USB_V2 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3926,7 -3906,7 +3935,7 @@@ F: Documentation/devicetree/bindings/in E4000 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -3942,7 -3922,7 +3951,7 @@@ F: drivers/scsi/eata. EC100 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -4166,7 -4146,7 +4175,7 @@@ F: drivers/net/ethernet/ibm/ehea EM28XX VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/usb/em28xx/ @@@ -4306,7 -4286,7 +4315,7 @@@ F: drivers/media/tuners/fc0011. FC2580 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -4520,9 -4500,8 +4529,9 @@@ F: include/linux/fs_enet_pd. FREESCALE QUICC ENGINE LIBRARY L: linuxppc-dev@lists.ozlabs.org S: Orphan -F: arch/powerpc/sysdev/qe_lib/ -F: arch/powerpc/include/asm/*qe.h +F: drivers/soc/fsl/qe/ +F: include/soc/fsl/*qe*.h +F: include/soc/fsl/*ucc*.h
FREESCALE USB PERIPHERAL DRIVERS M: Li Yang leoli@freescale.com @@@ -4630,7 -4609,7 +4639,7 @@@ M: Heungjun Kim <riverful.kim@samsung.c L: linux-media@vger.kernel.org S: Maintained F: drivers/media/i2c/m5mols/ -F: include/media/m5mols.h +F: include/media/i2c/m5mols.h
FUJITSU TABLET EXTRAS M: Robert Gerlach khnz@gmx.de @@@ -4676,7 -4655,7 +4685,7 @@@ GEMTEK FM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-gemtek*
@@@ -4884,7 -4863,7 +4893,7 @@@ HDPVR USB VIDEO ENCODER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/usb/hdpvr/
@@@ -4903,7 -4882,7 +4912,7 @@@ F: drivers/tty/hvc HACKRF MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -4946,7 -4925,7 +4955,7 @@@ F: sound/parisc/harmony. HD29L2 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -5015,7 -4994,6 +5024,7 @@@ F: arch/*/include/asm/suspend*.
HID CORE LAYER M: Jiri Kosina jikos@kernel.org +R: Benjamin Tissoires benjamin.tissoires@redhat.com L: linux-input@vger.kernel.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained @@@ -5076,7 -5054,7 +5085,7 @@@ L: hostap@shmoo.com (subscribers-only L: linux-wireless@vger.kernel.org W: http://hostap.epitest.fi/ S: Maintained - F: drivers/net/wireless/hostap/ + F: drivers/net/wireless/intersil/hostap/
HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER L: platform-driver-x86@vger.kernel.org @@@ -5314,6 -5292,13 +5323,13 @@@ L: netdev@vger.kernel.or S: Supported F: drivers/net/ethernet/ibm/ibmveth.*
+ IBM Power SRIOV Virtual NIC Device Driver + M: Thomas Falcon tlfalcon@linux.vnet.ibm.com + M: John Allen jallen@linux.vnet.ibm.com + L: netdev@vger.kernel.org + S: Supported + F: drivers/net/ethernet/ibm/ibmvnic.* + IBM Power Virtual SCSI Device Drivers M: Tyrel Datwyler tyreld@linux.vnet.ibm.com L: linux-scsi@vger.kernel.org @@@ -5644,7 -5629,7 +5660,7 @@@ L: linux-wireless@vger.kernel.or S: Maintained F: Documentation/networking/README.ipw2100 F: Documentation/networking/README.ipw2200 - F: drivers/net/wireless/ipw2x00/ + F: drivers/net/wireless/intel/ipw2x00/
INTEL(R) TRACE HUB M: Alexander Shishkin alexander.shishkin@linux.intel.com @@@ -5678,7 -5663,7 +5694,7 @@@ INTEL WIRELESS 3945ABG/BG, 4965AGN (iwl M: Stanislaw Gruszka sgruszka@redhat.com L: linux-wireless@vger.kernel.org S: Supported - F: drivers/net/wireless/iwlegacy/ + F: drivers/net/wireless/intel/iwlegacy/
INTEL WIRELESS WIFI LINK (iwlwifi) M: Johannes Berg johannes.berg@intel.com @@@ -5688,7 -5673,7 +5704,7 @@@ L: linux-wireless@vger.kernel.or W: http://intellinuxwireless.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi.git S: Supported - F: drivers/net/wireless/iwlwifi/ + F: drivers/net/wireless/intel/iwlwifi/
INTEL MANAGEMENT ENGINE (mei) M: Tomas Winkler tomas.winkler@intel.com @@@ -5853,7 -5838,7 +5869,7 @@@ ISA RADIO MODUL M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-isa*
@@@ -5923,7 -5908,7 +5939,7 @@@ F: drivers/hwmon/it87. IT913X MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -5944,7 -5929,7 +5960,7 @@@ F: include/uapi/linux/ivtv IX2505V MEDIA DRIVER M: Malcolm Priestley tvboxspy@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ S: Maintained F: drivers/media/dvb-frontends/ix2505v* @@@ -6033,7 -6018,7 +6049,7 @@@ KEENE FM RADIO TRANSMITTER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-keene*
@@@ -6246,12 -6231,6 +6262,12 @@@ S: Maintaine F: net/l3mdev F: include/net/l3mdev.h
+LANTIQ MIPS ARCHITECTURE +M: John Crispin blogic@openwrt.org +L: linux-mips@linux-mips.org +S: Maintained +F: arch/mips/lantiq + LAPB module L: linux-x25@vger.kernel.org S: Orphan @@@ -6291,7 -6270,7 +6307,7 @@@ F: drivers/usb/misc/legousbtower. LG2160 MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -6301,7 -6280,7 +6317,7 @@@ F: drivers/media/dvb-frontends/lg2160. LGDT3305 MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -6468,7 -6447,7 +6484,7 @@@ S: Maintaine F: arch/powerpc/platforms/8xx/
LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX -M: Scott Wood scottwood@freescale.com +M: Scott Wood oss@buserror.net M: Kumar Gala galak@kernel.crashing.org W: http://www.penguinppc.org/ L: linuxppc-dev@lists.ozlabs.org @@@ -6558,7 -6537,7 +6574,7 @@@ F: drivers/hwmon/lm95234. LME2510 MEDIA DRIVER M: Malcolm Priestley tvboxspy@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ S: Maintained F: drivers/media/usb/dvb-usb-v2/lmedm04* @@@ -6664,7 -6643,7 +6680,7 @@@ F: arch/m68k/hp300 M88DS3103 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -6674,7 -6653,7 +6690,7 @@@ F: drivers/media/dvb-frontends/m88ds310 M88RS2000 MEDIA DRIVER M: Malcolm Priestley tvboxspy@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ S: Maintained F: drivers/media/dvb-frontends/m88rs2000* @@@ -6745,7 -6724,7 +6761,7 @@@ F: drivers/net/ethernet/marvell/sk MARVELL LIBERTAS WIRELESS DRIVER L: libertas-dev@lists.infradead.org S: Orphan - F: drivers/net/wireless/libertas/ + F: drivers/net/wireless/marvell/libertas/
MARVELL MV643XX ETHERNET DRIVER M: Sebastian Hesselbarth sebastian.hesselbarth@gmail.com @@@ -6765,13 -6744,13 +6781,13 @@@ M: Amitkumar Karwar <akarwar@marvell.co M: Nishant Sarmukadam nishants@marvell.com L: linux-wireless@vger.kernel.org S: Maintained - F: drivers/net/wireless/mwifiex/ + F: drivers/net/wireless/marvell/mwifiex/
MARVELL MWL8K WIRELESS DRIVER M: Lennert Buytenhek buytenh@wantstofly.org L: linux-wireless@vger.kernel.org S: Odd Fixes - F: drivers/net/wireless/mwl8k.c + F: drivers/net/wireless/marvell/mwl8k.c
MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER M: Nicolas Pitre nico@fluxnic.net @@@ -6853,7 -6832,7 +6869,7 @@@ MAXIRADIO FM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-maxiradio*
@@@ -6875,7 -6854,7 +6891,7 @@@ F: drivers/media/platform/vsp1 MEDIA DRIVERS FOR ASCOT2E M: Sergey Kozlov serjk@netup.ru L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org W: http://netup.tv/ T: git git://linuxtv.org/media_tree.git S: Supported @@@ -6884,7 -6863,7 +6900,7 @@@ F: drivers/media/dvb-frontends/ascot2e MEDIA DRIVERS FOR CXD2841ER M: Sergey Kozlov serjk@netup.ru L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://netup.tv/ T: git git://linuxtv.org/media_tree.git S: Supported @@@ -6893,7 -6872,7 +6909,7 @@@ F: drivers/media/dvb-frontends/cxd2841e MEDIA DRIVERS FOR HORUS3A M: Sergey Kozlov serjk@netup.ru L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://netup.tv/ T: git git://linuxtv.org/media_tree.git S: Supported @@@ -6902,7 -6881,7 +6918,7 @@@ F: drivers/media/dvb-frontends/horus3a MEDIA DRIVERS FOR LNBH25 M: Sergey Kozlov serjk@netup.ru L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://netup.tv/ T: git git://linuxtv.org/media_tree.git S: Supported @@@ -6911,7 -6890,7 +6927,7 @@@ F: drivers/media/dvb-frontends/lnbh25 MEDIA DRIVERS FOR NETUP PCI UNIVERSAL DVB devices M: Sergey Kozlov serjk@netup.ru L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://netup.tv/ T: git git://linuxtv.org/media_tree.git S: Supported @@@ -6921,7 -6900,7 +6937,7 @@@ MEDIA INPUT INFRASTRUCTURE (V4L/DVB M: Mauro Carvalho Chehab mchehab@osg.samsung.com P: LinuxTV.org Project L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org Q: http://patchwork.kernel.org/project/linux-media/list/ T: git git://linuxtv.org/media_tree.git S: Maintained @@@ -6930,7 -6909,6 +6946,7 @@@ F: Documentation/video4linux F: Documentation/DocBook/media/ F: drivers/media/ F: drivers/staging/media/ +F: include/linux/platform_data/media/ F: include/media/ F: include/uapi/linux/dvb/ F: include/uapi/linux/videodev2.h @@@ -7082,7 -7060,7 +7098,7 @@@ MIROSOUND PCM20 FM RADIO RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/radio/radio-miropcm20*
@@@ -7118,7 -7096,7 +7134,7 @@@ F: drivers/iio/temperature/mlx90614. MN88472 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -7129,7 -7107,7 +7145,7 @@@ F: drivers/media/dvb-frontends/mn88472. MN88473 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -7184,7 -7162,7 +7200,7 @@@ F: drivers/platform/x86/msi-wmi. MSI001 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -7194,7 -7172,7 +7210,7 @@@ F: drivers/media/tuners/msi001 MSI2500 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -7213,7 -7191,7 +7229,7 @@@ L: linux-media@vger.kernel.or T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/i2c/mt9m032.c -F: include/media/mt9m032.h +F: include/media/i2c/mt9m032.h
MT9P031 APTINA CAMERA SENSOR M: Laurent Pinchart laurent.pinchart@ideasonboard.com @@@ -7221,7 -7199,7 +7237,7 @@@ L: linux-media@vger.kernel.or T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/i2c/mt9p031.c -F: include/media/mt9p031.h +F: include/media/i2c/mt9p031.h
MT9T001 APTINA CAMERA SENSOR M: Laurent Pinchart laurent.pinchart@ideasonboard.com @@@ -7229,7 -7207,7 +7245,7 @@@ L: linux-media@vger.kernel.or T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/i2c/mt9t001.c -F: include/media/mt9t001.h +F: include/media/i2c/mt9t001.h
MT9V032 APTINA CAMERA SENSOR M: Laurent Pinchart laurent.pinchart@ideasonboard.com @@@ -7238,7 -7216,7 +7254,7 @@@ T: git git://linuxtv.org/media_tree.gi S: Maintained F: Documentation/devicetree/bindings/media/i2c/mt9v032.txt F: drivers/media/i2c/mt9v032.c -F: include/media/mt9v032.h +F: include/media/i2c/mt9v032.h
MULTIFUNCTION DEVICES (MFD) M: Lee Jones lee.jones@linaro.org @@@ -7282,7 -7260,7 +7298,7 @@@ F: drivers/usb/musb MXL5007T MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -7407,6 -7385,13 +7423,13 @@@ F: include/net/netrom. F: include/uapi/linux/netrom.h F: net/netrom/
+ NETRONOME ETHERNET DRIVERS + M: Jakub Kicinski jakub.kicinski@netronome.com + M: Rolf Neugebauer rolf.neugebauer@netronome.com + L: oss-drivers@netronome.com + S: Maintained + F: drivers/net/ethernet/netronome/ + NETWORK BLOCK DEVICE (NBD) M: Markus Pargmann mpa@pengutronix.de S: Maintained @@@ -7538,7 -7523,12 +7561,12 @@@ F: net/nfc F: include/net/nfc/ F: include/uapi/linux/nfc.h F: drivers/nfc/ + F: include/linux/platform_data/microread.h + F: include/linux/platform_data/nfcmrvl.h + F: include/linux/platform_data/nxp-nci.h F: include/linux/platform_data/pn544.h + F: include/linux/platform_data/st21nfca.h + F: include/linux/platform_data/st-nci.h F: Documentation/devicetree/bindings/net/nfc/
NFS, SUNRPC, AND LOCKD CLIENTS @@@ -7988,7 -7978,7 +8016,7 @@@ L: linux-wireless@vger.kernel.or W: http://wireless.kernel.org/en/users/Drivers/orinoco W: http://www.nongnu.org/orinoco/ S: Orphan - F: drivers/net/wireless/orinoco/ + F: drivers/net/wireless/intersil/orinoco/
OSD LIBRARY and FILESYSTEM M: Boaz Harrosh ooo@electrozaur.com @@@ -8014,7 -8004,7 +8042,7 @@@ M: Christian Lamparter <chunkeey@google L: linux-wireless@vger.kernel.org W: http://wireless.kernel.org/en/users/Drivers/p54 S: Maintained - F: drivers/net/wireless/p54/ + F: drivers/net/wireless/intersil/p54/
PA SEMI ETHERNET DRIVER M: Olof Johansson olof@lixom.net @@@ -8281,19 -8271,11 +8309,19 @@@ F: drivers/pci/host/pci-xgene-msi.
PCIE DRIVER FOR HISILICON M: Zhou Wang wangzhou1@hisilicon.com +M: Gabriele Paoloni gabriele.paoloni@huawei.com L: linux-pci@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt F: drivers/pci/host/pcie-hisi.c
+PCIE DRIVER FOR QUALCOMM MSM +M: Stanimir Varbanov svarbanov@mm-sol.com +L: linux-pci@vger.kernel.org +L: linux-arm-msm@vger.kernel.org +S: Maintained +F: drivers/pci/host/*qcom* + PCMCIA SUBSYSTEM P: Linux PCMCIA Team L: linux-pcmcia@lists.infradead.org @@@ -8493,17 -8475,6 +8521,17 @@@ F: fs/timerfd. F: include/linux/timer* F: kernel/time/*timer*
+POWER MANAGEMENT CORE +M: "Rafael J. Wysocki" rjw@rjwysocki.net +L: linux-pm@vger.kernel.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm +S: Supported +F: drivers/base/power/ +F: include/linux/pm.h +F: include/linux/pm_* +F: include/linux/powercap.h +F: drivers/powercap/ + POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS M: Sebastian Reichel sre@kernel.org M: Dmitry Eremin-Solenikov dbaryshkov@gmail.com @@@ -8583,7 -8554,7 +8611,7 @@@ M: "Luis R. Rodriguez" <mcgrof@gmail.co L: linux-wireless@vger.kernel.org W: http://wireless.kernel.org/en/users/Drivers/p54 S: Obsolete - F: drivers/net/wireless/prism54/ + F: drivers/net/wireless/intersil/prism54/
PS3 NETWORK SUPPORT M: Geoff Levand geoff@infradead.org @@@ -8802,7 -8773,7 +8830,7 @@@ F: include/uapi/linux/qnxtypes. QT1010 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -8880,19 -8851,13 +8908,19 @@@ L: linux-fbdev@vger.kernel.or S: Maintained F: drivers/video/fbdev/aty/aty128fb.c
+RALINK MIPS ARCHITECTURE +M: John Crispin blogic@openwrt.org +L: linux-mips@linux-mips.org +S: Maintained +F: arch/mips/ralink + RALINK RT2X00 WIRELESS LAN DRIVER P: rt2x00 project M: Stanislaw Gruszka sgruszka@redhat.com M: Helmut Schaa helmut.schaa@googlemail.com L: linux-wireless@vger.kernel.org S: Maintained - F: drivers/net/wireless/rt2x00/ + F: drivers/net/wireless/ralink/rt2x00/
RAMDISK RAM BLOCK DEVICE DRIVER M: Jens Axboe axboe@kernel.dk @@@ -9101,7 -9066,7 +9129,7 @@@ F: net/rose RTL2830 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -9111,7 -9076,7 +9139,7 @@@ F: drivers/media/dvb-frontends/rtl2830 RTL2832 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -9121,7 -9086,7 +9149,7 @@@ F: drivers/media/dvb-frontends/rtl2832 RTL2832_SDR MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -9133,7 -9098,7 +9161,7 @@@ L: linux-wireless@vger.kernel.or W: http://wireless.kernel.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Orphan - F: drivers/net/wireless/rtl818x/rtl8180/ + F: drivers/net/wireless/realtek/rtl818x/rtl8180/
RTL8187 WIRELESS DRIVER M: Herton Ronaldo Krzesinski herton@canonical.com @@@ -9143,7 -9108,7 +9171,7 @@@ L: linux-wireless@vger.kernel.or W: http://wireless.kernel.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained - F: drivers/net/wireless/rtl818x/rtl8187/ + F: drivers/net/wireless/realtek/rtl818x/rtl8187/
RTL8192CE WIRELESS DRIVER M: Larry Finger Larry.Finger@lwfinger.net @@@ -9152,8 -9117,8 +9180,8 @@@ L: linux-wireless@vger.kernel.or W: http://wireless.kernel.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained - F: drivers/net/wireless/rtlwifi/ - F: drivers/net/wireless/rtlwifi/rtl8192ce/ + F: drivers/net/wireless/realtek/rtlwifi/ + F: drivers/net/wireless/realtek/rtlwifi/rtl8192ce/
RTL8XXXU WIRELESS DRIVER (rtl8xxxu) M: Jes Sorensen Jes.Sorensen@redhat.com @@@ -9197,7 -9162,7 +9225,7 @@@ F: drivers/s390/block/dasd F: block/partitions/ibm.c
S390 NETWORK DRIVERS - M: Ursula Braun ursula.braun@de.ibm.com + M: Ursula Braun ubraun@linux.vnet.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported @@@ -9227,7 -9192,7 +9255,7 @@@ S: Supporte F: drivers/s390/scsi/zfcp_*
S390 IUCV NETWORK LAYER - M: Ursula Braun ursula.braun@de.ibm.com + M: Ursula Braun ubraun@linux.vnet.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported @@@ -9252,14 -9217,14 +9280,14 @@@ SAA6588 RDS RECEIVER DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/i2c/saa6588*
SAA7134 VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: Documentation/video4linux/*.saa7134 @@@ -9321,7 -9286,7 +9349,7 @@@ L: linux-media@vger.kernel.or L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) S: Maintained F: drivers/media/platform/s3c-camif/ -F: include/media/s3c_camif.h +F: include/media/drv-intf/s3c_camif.h
SAMSUNG S5C73M3 CAMERA DRIVER M: Kyungmin Park kyungmin.park@samsung.com @@@ -9696,7 -9661,7 +9724,7 @@@ F: drivers/misc/sgi-xp SI2157 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -9706,7 -9671,7 +9734,7 @@@ F: drivers/media/tuners/si2157 SI2168 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -9717,7 -9682,7 +9745,7 @@@ SI470X FM RADIO RECEIVER I2C DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/radio/si470x/radio-si470x-i2c.c
@@@ -9725,7 -9690,7 +9753,7 @@@ SI470X FM RADIO RECEIVER USB DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/si470x/radio-si470x-common.c F: drivers/media/radio/si470x/radio-si470x.h @@@ -9735,7 -9700,7 +9763,7 @@@ SI4713 FM RADIO TRANSMITTER I2C DRIVE M: Eduardo Valentin edubezval@gmail.com L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/radio/si4713/si4713.?
@@@ -9743,7 -9708,7 +9771,7 @@@ SI4713 FM RADIO TRANSMITTER PLATFORM DR M: Eduardo Valentin edubezval@gmail.com L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/radio/si4713/radio-platform-si4713.c
@@@ -9751,14 -9716,14 +9779,14 @@@ SI4713 FM RADIO TRANSMITTER USB DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/si4713/radio-usb-si4713.c
SIANO DVB DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: drivers/media/common/siano/ @@@ -9783,7 -9748,7 +9811,7 @@@ SH_VOU V4L2 OUTPUT DRIVE L: linux-media@vger.kernel.org S: Orphan F: drivers/media/platform/sh_vou.c -F: include/media/sh_vou.h +F: include/media/drv-intf/sh_vou.h
SIMPLE FIRMWARE INTERFACE (SFI) M: Len Brown lenb@kernel.org @@@ -9824,7 -9789,7 +9852,7 @@@ F: drivers/i2c/busses/i2c-davinci. TI DAVINCI SERIES MEDIA DRIVER M: "Lad, Prabhakar" prabhakar.csengg@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git S: Maintained @@@ -9834,7 -9799,7 +9862,7 @@@ F: include/media/davinci TI AM437X VPFE DRIVER M: "Lad, Prabhakar" prabhakar.csengg@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git S: Maintained @@@ -9843,12 -9808,12 +9871,12 @@@ F: drivers/media/platform/am437x OV2659 OMNIVISION SENSOR DRIVER M: "Lad, Prabhakar" prabhakar.csengg@gmail.com L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git S: Maintained F: drivers/media/i2c/ov2659.c -F: include/media/ov2659.h +F: include/media/i2c/ov2659.h
SILICON MOTION SM712 FRAME BUFFER DRIVER M: Sudip Mukherjee sudipm.mukherjee@gmail.com @@@ -9937,7 -9902,7 +9965,7 @@@ M: Sakari Ailus <sakari.ailus@iki.fi L: linux-media@vger.kernel.org S: Maintained F: drivers/media/i2c/smiapp/ -F: include/media/smiapp.h +F: include/media/i2c/smiapp.h F: drivers/media/i2c/smiapp-pll.c F: drivers/media/i2c/smiapp-pll.h F: include/uapi/linux/smiapp.h @@@ -10101,7 -10066,7 +10129,7 @@@ F: sound/soc/soc-generic-dmaengine-pcm. SP2 MEDIA DRIVER M: Olli Salonen olli.salonen@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org Q: http://patchwork.linuxtv.org/project/linux-media/list/ S: Maintained F: drivers/media/dvb-frontends/sp2* @@@ -10463,7 -10428,7 +10491,7 @@@ F: net/ipv4/tcp_lp. TDA10071 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -10473,7 -10438,7 +10501,7 @@@ F: drivers/media/dvb-frontends/tda10071 TDA18212 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -10483,7 -10448,7 +10511,7 @@@ F: drivers/media/tuners/tda18212 TDA18218 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -10493,7 -10458,7 +10521,7 @@@ F: drivers/media/tuners/tda18218 TDA18271 MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -10503,7 -10468,7 +10531,7 @@@ F: drivers/media/tuners/tda18271 TDA827x MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -10513,7 -10478,7 +10541,7 @@@ F: drivers/media/tuners/tda8290. TDA8290 MEDIA DRIVER M: Michael Krufky mkrufky@linuxtv.org L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://github.com/mkrufky Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/mkrufky/tuners.git @@@ -10524,14 -10489,14 +10552,14 @@@ TDA9840 MEDIA DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/i2c/tda9840*
TEA5761 TUNER DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: drivers/media/tuners/tea5761.* @@@ -10539,7 -10504,7 +10567,7 @@@ TEA5767 TUNER DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/tuners/tea5767.* @@@ -10548,7 -10513,7 +10576,7 @@@ TEA6415C MEDIA DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/i2c/tea6415c*
@@@ -10556,7 -10521,7 +10584,7 @@@ TEA6420 MEDIA DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/i2c/tea6420*
@@@ -10654,7 -10619,7 +10682,7 @@@ THANKO'S RAREMONO AM/FM/SW RADIO RECEIV M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/radio/radio-raremono.c
@@@ -10804,7 -10769,6 +10832,7 @@@ F: net/tipc TILE ARCHITECTURE M: Chris Metcalf cmetcalf@ezchip.com W: http://www.ezchip.com/scm/ +T: git git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile.git S: Supported F: arch/tile/ F: drivers/char/tile-srom.c @@@ -10879,7 -10843,7 +10907,7 @@@ M: Mats Randgaard <matrandg@cisco.com L: linux-media@vger.kernel.org S: Maintained F: drivers/media/i2c/tc358743* -F: include/media/tc358743.h +F: include/media/i2c/tc358743.h
TMIO MMC DRIVER M: Ian Molton ian@mnementh.co.uk @@@ -10907,7 -10871,7 +10935,7 @@@ F: mm/shmem. TM6000 VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Odd fixes F: drivers/media/usb/tm6000/ @@@ -10916,7 -10880,7 +10944,7 @@@ TW68 VIDEO4LINUX DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/pci/tw68/
@@@ -10977,7 -10941,7 +11005,7 @@@ F: include/uapi/linux/tty. TUA9001 MEDIA DRIVER M: Antti Palosaari crope@iki.fi L: linux-media@vger.kernel.org -W: http://linuxtv.org/ +W: https://linuxtv.org W: http://palosaari.fi/linux/ Q: http://patchwork.linuxtv.org/project/linux-media/list/ T: git git://linuxtv.org/anttip/media_tree.git @@@ -11179,7 -11143,6 +11207,7 @@@ F: include/linux/usb/gadget
USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) M: Jiri Kosina jikos@kernel.org +R: Benjamin Tissoires benjamin.tissoires@redhat.com L: linux-usb@vger.kernel.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained @@@ -11257,6 -11220,13 +11285,13 @@@ L: linux-usb@vger.kernel.or S: Supported F: drivers/usb/class/usblp.c
+ USB QMI WWAN NETWORK DRIVER + M: Bjørn Mork bjorn@mork.no + L: netdev@vger.kernel.org + S: Maintained + F: Documentation/ABI/testing/sysfs-class-net-qmi + F: drivers/net/usb/qmi_wwan.c + USB RTL8150 DRIVER M: Petko Manolov petkan@nucleusys.com L: linux-usb@vger.kernel.org @@@ -11325,7 -11295,7 +11360,7 @@@ USB VISION DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Odd Fixes F: drivers/media/usb/usbvision/
@@@ -11353,7 -11323,7 +11388,7 @@@ USB ZD1201 DRIVE L: linux-wireless@vger.kernel.org W: http://linux-lc100020.sourceforge.net S: Orphan - F: drivers/net/wireless/zd1201.* + F: drivers/net/wireless/zydas/zd1201.*
USB ZR364XX DRIVER M: Antoine Jacquet royale@zerezo.com @@@ -11539,7 -11509,7 +11574,7 @@@ VIVID VIRTUAL VIDEO DRIVE M: Hans Verkuil hverkuil@xs4all.nl L: linux-media@vger.kernel.org T: git git://linuxtv.org/media_tree.git -W: http://linuxtv.org +W: https://linuxtv.org S: Maintained F: drivers/media/platform/vivid/*
@@@ -11828,7 -11798,7 +11863,7 @@@ F: arch/x86/entry/vdso XC2028/3028 TUNER DRIVER M: Mauro Carvalho Chehab mchehab@osg.samsung.com L: linux-media@vger.kernel.org -W: http://linuxtv.org +W: https://linuxtv.org T: git git://linuxtv.org/media_tree.git S: Maintained F: drivers/media/tuners/tuner-xc2028.* @@@ -11984,7 -11954,7 +12019,7 @@@ W: http://zd1211.ath.cx/wiki/DriverRewr L: linux-wireless@vger.kernel.org L: zd1211-devs@lists.sourceforge.net (subscribers-only) S: Maintained - F: drivers/net/wireless/zd1211rw/ + F: drivers/net/wireless/zydas/zd1211rw/
ZPOOL COMPRESSED PAGE STORAGE API M: Dan Streetman ddstreet@ieee.org @@@ -11997,7 -11967,7 +12032,7 @@@ ZR36067 VIDEO FOR LINUX DRIVE L: mjpeg-users@lists.sourceforge.net L: linux-media@vger.kernel.org W: http://mjpeg.sourceforge.net/driver-zoran/ -T: hg http://linuxtv.org/hg/v4l-dvb +T: hg https://linuxtv.org/hg/v4l-dvb S: Odd Fixes F: drivers/media/pci/zoran/
diff --combined crypto/algif_skcipher.c index df483f9,5e20ca1..882de31 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c @@@ -31,11 -31,6 +31,11 @@@ struct skcipher_sg_list struct scatterlist sg[0]; };
+struct skcipher_tfm { + struct crypto_skcipher *skcipher; + bool has_key; +}; + struct skcipher_ctx { struct list_head tsgl; struct af_alg_sgl rsgl; @@@ -243,7 -238,7 +243,7 @@@ static void skcipher_wmem_wakeup(struc
rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); - if (wq_has_sleeper(wq)) + if (skwq_has_sleeper(wq)) wake_up_interruptible_sync_poll(&wq->wait, POLLIN | POLLRDNORM | POLLRDBAND); @@@ -293,7 -288,7 +293,7 @@@ static void skcipher_data_wakeup(struc
rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); - if (wq_has_sleeper(wq)) + if (skwq_has_sleeper(wq)) wake_up_interruptible_sync_poll(&wq->wait, POLLOUT | POLLRDNORM | POLLRDBAND); @@@ -755,41 -750,17 +755,41 @@@ static struct proto_ops algif_skcipher_
static void *skcipher_bind(const char *name, u32 type, u32 mask) { - return crypto_alloc_skcipher(name, type, mask); + struct skcipher_tfm *tfm; + struct crypto_skcipher *skcipher; + + tfm = kzalloc(sizeof(*tfm), GFP_KERNEL); + if (!tfm) + return ERR_PTR(-ENOMEM); + + skcipher = crypto_alloc_skcipher(name, type, mask); + if (IS_ERR(skcipher)) { + kfree(tfm); + return ERR_CAST(skcipher); + } + + tfm->skcipher = skcipher; + + return tfm; }
static void skcipher_release(void *private) { - crypto_free_skcipher(private); + struct skcipher_tfm *tfm = private; + + crypto_free_skcipher(tfm->skcipher); + kfree(tfm); }
static int skcipher_setkey(void *private, const u8 *key, unsigned int keylen) { - return crypto_skcipher_setkey(private, key, keylen); + struct skcipher_tfm *tfm = private; + int err; + + err = crypto_skcipher_setkey(tfm->skcipher, key, keylen); + tfm->has_key = !err; + + return err; }
static void skcipher_wait(struct sock *sk) @@@ -821,25 -792,20 +821,25 @@@ static int skcipher_accept_parent(void { struct skcipher_ctx *ctx; struct alg_sock *ask = alg_sk(sk); - unsigned int len = sizeof(*ctx) + crypto_skcipher_reqsize(private); + struct skcipher_tfm *tfm = private; + struct crypto_skcipher *skcipher = tfm->skcipher; + unsigned int len = sizeof(*ctx) + crypto_skcipher_reqsize(skcipher); + + if (!tfm->has_key) + return -ENOKEY;
ctx = sock_kmalloc(sk, len, GFP_KERNEL); if (!ctx) return -ENOMEM;
- ctx->iv = sock_kmalloc(sk, crypto_skcipher_ivsize(private), + ctx->iv = sock_kmalloc(sk, crypto_skcipher_ivsize(skcipher), GFP_KERNEL); if (!ctx->iv) { sock_kfree_s(sk, ctx, len); return -ENOMEM; }
- memset(ctx->iv, 0, crypto_skcipher_ivsize(private)); + memset(ctx->iv, 0, crypto_skcipher_ivsize(skcipher));
INIT_LIST_HEAD(&ctx->tsgl); ctx->len = len; @@@ -852,7 -818,7 +852,7 @@@
ask->private = ctx;
- skcipher_request_set_tfm(&ctx->req, private); + skcipher_request_set_tfm(&ctx->req, skcipher); skcipher_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG, af_alg_complete, &ctx->completion);
diff --combined drivers/net/ethernet/freescale/fsl_pq_mdio.c index 8344bba,622005a..f3c63dc --- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c +++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c @@@ -29,7 -29,7 +29,7 @@@
#include <asm/io.h> #if IS_ENABLED(CONFIG_UCC_GETH) -#include <asm/ucc.h> /* for ucc_set_qe_mux_mii_mng() */ +#include <soc/fsl/qe/ucc.h> #endif
#include "gianfar.h" @@@ -69,7 -69,6 +69,6 @@@ struct fsl_pq_mdio struct fsl_pq_mdio_priv { void __iomem *map; struct fsl_pq_mii __iomem *regs; - int irqs[PHY_MAX_ADDR]; };
/* @@@ -401,7 -400,6 +400,6 @@@ static int fsl_pq_mdio_probe(struct pla new_bus->read = &fsl_pq_mdio_read; new_bus->write = &fsl_pq_mdio_write; new_bus->reset = &fsl_pq_mdio_reset; - new_bus->irq = priv->irqs;
err = of_address_to_resource(np, 0, &res); if (err < 0) { diff --combined drivers/net/ethernet/freescale/ucc_geth.c index c30b72e,0e7f24e..bc0b1cb --- a/drivers/net/ethernet/freescale/ucc_geth.c +++ b/drivers/net/ethernet/freescale/ucc_geth.c @@@ -40,10 -40,10 +40,10 @@@ #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> -#include <asm/immap_qe.h> -#include <asm/qe.h> -#include <asm/ucc.h> -#include <asm/ucc_fast.h> +#include <soc/fsl/qe/immap_qe.h> +#include <soc/fsl/qe/qe.h> +#include <soc/fsl/qe/ucc.h> +#include <soc/fsl/qe/ucc_fast.h> #include <asm/machdep.h>
#include "ucc_geth.h" @@@ -1385,7 -1385,7 +1385,7 @@@ static int adjust_enet_interface(struc value &= ~0x1000; /* Turn off autonegotiation */ phy_write(tbiphy, ENET_TBI_MII_CR, value);
- put_device(&tbiphy->dev); + put_device(&tbiphy->mdio.dev); }
init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2); @@@ -1705,7 -1705,7 +1705,7 @@@ static void uec_configure_serdes(struc * several seconds for it to come back. */ if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) { - put_device(&tbiphy->dev); + put_device(&tbiphy->mdio.dev); return; }
diff --combined drivers/net/geneve.c index db96b0c,24b077a..7456569 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@@ -71,8 -71,14 +71,14 @@@ struct geneve_dev __be16 dst_port; bool collect_md; struct gro_cells gro_cells; + u32 flags; };
+ /* Geneve device flags */ + #define GENEVE_F_UDP_CSUM BIT(0) + #define GENEVE_F_UDP_ZERO_CSUM6_TX BIT(1) + #define GENEVE_F_UDP_ZERO_CSUM6_RX BIT(2) + struct geneve_sock { bool collect_md; struct list_head list; @@@ -81,6 -87,7 +87,7 @@@ int refcnt; struct udp_offload udp_offloads; struct hlist_head vni_list[VNI_HASH_SIZE]; + u32 flags; };
static inline __u32 geneve_net_vni_hash(u8 vni[3]) @@@ -343,7 -350,7 +350,7 @@@ error }
static struct socket *geneve_create_sock(struct net *net, bool ipv6, - __be16 port) + __be16 port, u32 flags) { struct socket *sock; struct udp_port_cfg udp_conf; @@@ -354,6 -361,8 +361,8 @@@ if (ipv6) { udp_conf.family = AF_INET6; udp_conf.ipv6_v6only = 1; + udp_conf.use_udp6_rx_checksums = + !(flags & GENEVE_F_UDP_ZERO_CSUM6_RX); } else { udp_conf.family = AF_INET; udp_conf.local_ip.s_addr = htonl(INADDR_ANY); @@@ -371,16 -380,27 +380,27 @@@
static void geneve_notify_add_rx_port(struct geneve_sock *gs) { + struct net_device *dev; struct sock *sk = gs->sock->sk; + struct net *net = sock_net(sk); sa_family_t sa_family = sk->sk_family; + __be16 port = inet_sk(sk)->inet_sport; int err;
if (sa_family == AF_INET) { - err = udp_add_offload(&gs->udp_offloads); + err = udp_add_offload(sock_net(sk), &gs->udp_offloads); if (err) pr_warn("geneve: udp_add_offload failed with status %d\n", err); } + + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + if (dev->netdev_ops->ndo_add_geneve_port) + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, + port); + } + rcu_read_unlock(); }
static int geneve_hlen(struct genevehdr *gh) @@@ -480,7 -500,7 +500,7 @@@ static int geneve_gro_complete(struct s
/* Create new listen socket if needed */ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port, - bool ipv6) + bool ipv6, u32 flags) { struct geneve_net *gn = net_generic(net, geneve_net_id); struct geneve_sock *gs; @@@ -492,7 -512,7 +512,7 @@@ if (!gs) return ERR_PTR(-ENOMEM);
- sock = geneve_create_sock(net, ipv6, port); + sock = geneve_create_sock(net, ipv6, port, flags); if (IS_ERR(sock)) { kfree(gs); return ERR_CAST(sock); @@@ -521,8 -541,20 +541,20 @@@
static void geneve_notify_del_rx_port(struct geneve_sock *gs) { + struct net_device *dev; struct sock *sk = gs->sock->sk; + struct net *net = sock_net(sk); sa_family_t sa_family = sk->sk_family; + __be16 port = inet_sk(sk)->inet_sport; + + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + if (dev->netdev_ops->ndo_del_geneve_port) + dev->netdev_ops->ndo_del_geneve_port(dev, sa_family, + port); + } + + rcu_read_unlock();
if (sa_family == AF_INET) udp_del_offload(&gs->udp_offloads); @@@ -575,12 -607,13 +607,13 @@@ static int geneve_sock_add(struct genev goto out; }
- gs = geneve_socket_create(net, geneve->dst_port, ipv6); + gs = geneve_socket_create(net, geneve->dst_port, ipv6, geneve->flags); if (IS_ERR(gs)) return PTR_ERR(gs);
out: gs->collect_md = geneve->collect_md; + gs->flags = geneve->flags; #if IS_ENABLED(CONFIG_IPV6) if (ipv6) geneve->sock6 = gs; @@@ -642,11 -675,12 +675,12 @@@ static void geneve_build_header(struct
static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb, __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, - bool csum, bool xnet) + u32 flags, bool xnet) { struct genevehdr *gnvh; int min_headroom; int err; + bool udp_sum = !!(flags & GENEVE_F_UDP_CSUM);
skb_scrub_packet(skb, xnet);
@@@ -658,7 -692,7 +692,7 @@@ goto free_rt; }
- skb = udp_tunnel_handle_offloads(skb, csum); + skb = udp_tunnel_handle_offloads(skb, udp_sum); if (IS_ERR(skb)) { err = PTR_ERR(skb); goto free_rt; @@@ -678,11 -712,12 +712,12 @@@ free_rt #if IS_ENABLED(CONFIG_IPV6) static int geneve6_build_skb(struct dst_entry *dst, struct sk_buff *skb, __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, - bool csum, bool xnet) + u32 flags, bool xnet) { struct genevehdr *gnvh; int min_headroom; int err; + bool udp_sum = !(flags & GENEVE_F_UDP_ZERO_CSUM6_TX);
skb_scrub_packet(skb, xnet);
@@@ -694,7 -729,7 +729,7 @@@ goto free_dst; }
- skb = udp_tunnel_handle_offloads(skb, csum); + skb = udp_tunnel_handle_offloads(skb, udp_sum); if (IS_ERR(skb)) { err = PTR_ERR(skb); goto free_dst; @@@ -824,9 -859,9 +859,9 @@@ static netdev_tx_t geneve_xmit_skb(stru struct flowi4 fl4; __u8 tos, ttl; __be16 sport; - bool udp_csum; __be16 df; bool xnet = !net_eq(geneve->net, dev_net(geneve->dev)); + u32 flags = geneve->flags;
if (geneve->collect_md) { if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) { @@@ -857,9 -892,13 +892,13 @@@ if (key->tun_flags & TUNNEL_GENEVE_OPT) opts = ip_tunnel_info_opts(info);
- udp_csum = !!(key->tun_flags & TUNNEL_CSUM); + if (key->tun_flags & TUNNEL_CSUM) + flags |= GENEVE_F_UDP_CSUM; + else + flags &= ~GENEVE_F_UDP_CSUM; + err = geneve_build_skb(rt, skb, key->tun_flags, vni, - info->options_len, opts, udp_csum, xnet); + info->options_len, opts, flags, xnet); if (unlikely(err)) goto err;
@@@ -867,9 -906,8 +906,8 @@@ ttl = key->ttl; df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0; } else { - udp_csum = false; err = geneve_build_skb(rt, skb, 0, geneve->vni, - 0, NULL, udp_csum, xnet); + 0, NULL, flags, xnet); if (unlikely(err)) goto err;
@@@ -880,12 -918,11 +918,11 @@@ ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); df = 0; } - err = udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr, - tos, ttl, df, sport, geneve->dst_port, - !net_eq(geneve->net, dev_net(geneve->dev)), - !udp_csum); + udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr, + tos, ttl, df, sport, geneve->dst_port, + !net_eq(geneve->net, dev_net(geneve->dev)), + !(flags & GENEVE_F_UDP_CSUM));
- iptunnel_xmit_stats(err, &dev->stats, dev->tstats); return NETDEV_TX_OK;
tx_error: @@@ -912,8 -949,8 +949,8 @@@ static netdev_tx_t geneve6_xmit_skb(str struct flowi6 fl6; __u8 prio, ttl; __be16 sport; - bool udp_csum; bool xnet = !net_eq(geneve->net, dev_net(geneve->dev)); + u32 flags = geneve->flags;
if (geneve->collect_md) { if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) { @@@ -942,19 -979,22 +979,22 @@@ if (key->tun_flags & TUNNEL_GENEVE_OPT) opts = ip_tunnel_info_opts(info);
- udp_csum = !!(key->tun_flags & TUNNEL_CSUM); + if (key->tun_flags & TUNNEL_CSUM) + flags |= GENEVE_F_UDP_CSUM; + else + flags &= ~GENEVE_F_UDP_CSUM; + err = geneve6_build_skb(dst, skb, key->tun_flags, vni, info->options_len, opts, - udp_csum, xnet); + flags, xnet); if (unlikely(err)) goto err;
prio = ip_tunnel_ecn_encap(key->tos, iip, skb); ttl = key->ttl; } else { - udp_csum = false; err = geneve6_build_skb(dst, skb, 0, geneve->vni, - 0, NULL, udp_csum, xnet); + 0, NULL, flags, xnet); if (unlikely(err)) goto err;
@@@ -964,9 -1004,10 +1004,10 @@@ ttl = 1; ttl = ttl ? : ip6_dst_hoplimit(dst); } - err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev, - &fl6.saddr, &fl6.daddr, prio, ttl, - sport, geneve->dst_port, !udp_csum); + udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev, + &fl6.saddr, &fl6.daddr, prio, ttl, + sport, geneve->dst_port, + !!(flags & GENEVE_F_UDP_ZERO_CSUM6_TX)); return NETDEV_TX_OK;
tx_error: @@@ -1065,6 -1106,30 +1106,30 @@@ static struct device_type geneve_type .name = "geneve", };
+ /* Calls the ndo_add_geneve_port of the caller in order to + * supply the listening GENEVE udp ports. Callers are expected + * to implement the ndo_add_geneve_port. + */ + void geneve_get_rx_port(struct net_device *dev) + { + struct net *net = dev_net(dev); + struct geneve_net *gn = net_generic(net, geneve_net_id); + struct geneve_sock *gs; + sa_family_t sa_family; + struct sock *sk; + __be16 port; + + rcu_read_lock(); + list_for_each_entry_rcu(gs, &gn->sock_list, list) { + sk = gs->sock->sk; + sa_family = sk->sk_family; + port = inet_sk(sk)->inet_sport; + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, port); + } + rcu_read_unlock(); + } + EXPORT_SYMBOL_GPL(geneve_get_rx_port); + /* Initialize the device structure. */ static void geneve_setup(struct net_device *dev) { @@@ -1097,6 -1162,9 +1162,9 @@@ static const struct nla_policy geneve_p [IFLA_GENEVE_TOS] = { .type = NLA_U8 }, [IFLA_GENEVE_PORT] = { .type = NLA_U16 }, [IFLA_GENEVE_COLLECT_METADATA] = { .type = NLA_FLAG }, + [IFLA_GENEVE_UDP_CSUM] = { .type = NLA_U8 }, + [IFLA_GENEVE_UDP_ZERO_CSUM6_TX] = { .type = NLA_U8 }, + [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NLA_U8 }, };
static int geneve_validate(struct nlattr *tb[], struct nlattr *data[]) @@@ -1150,7 -1218,7 +1218,7 @@@ static struct geneve_dev *geneve_find_d static int geneve_configure(struct net *net, struct net_device *dev, union geneve_addr *remote, __u32 vni, __u8 ttl, __u8 tos, __be16 dst_port, - bool metadata) + bool metadata, u32 flags) { struct geneve_net *gn = net_generic(net, geneve_net_id); struct geneve_dev *t, *geneve = netdev_priv(dev); @@@ -1181,6 -1249,7 +1249,7 @@@ geneve->tos = tos; geneve->dst_port = dst_port; geneve->collect_md = metadata; + geneve->flags = flags;
t = geneve_find_dev(gn, dst_port, remote, geneve->vni, &tun_on_same_port, &tun_collect_md); @@@ -1219,6 -1288,7 +1288,7 @@@ static int geneve_newlink(struct net *n bool metadata = false; union geneve_addr remote = geneve_remote_unspec; __u32 vni = 0; + u32 flags = 0;
if (data[IFLA_GENEVE_REMOTE] && data[IFLA_GENEVE_REMOTE6]) return -EINVAL; @@@ -1259,8 -1329,20 +1329,20 @@@ if (data[IFLA_GENEVE_COLLECT_METADATA]) metadata = true;
+ if (data[IFLA_GENEVE_UDP_CSUM] && + nla_get_u8(data[IFLA_GENEVE_UDP_CSUM])) + flags |= GENEVE_F_UDP_CSUM; + + if (data[IFLA_GENEVE_UDP_ZERO_CSUM6_TX] && + nla_get_u8(data[IFLA_GENEVE_UDP_ZERO_CSUM6_TX])) + flags |= GENEVE_F_UDP_ZERO_CSUM6_TX; + + if (data[IFLA_GENEVE_UDP_ZERO_CSUM6_RX] && + nla_get_u8(data[IFLA_GENEVE_UDP_ZERO_CSUM6_RX])) + flags |= GENEVE_F_UDP_ZERO_CSUM6_RX; + return geneve_configure(net, dev, &remote, vni, ttl, tos, dst_port, - metadata); + metadata, flags); }
static void geneve_dellink(struct net_device *dev, struct list_head *head) @@@ -1279,6 -1361,9 +1361,9 @@@ static size_t geneve_get_size(const str nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_TOS */ nla_total_size(sizeof(__be16)) + /* IFLA_GENEVE_PORT */ nla_total_size(0) + /* IFLA_GENEVE_COLLECT_METADATA */ + nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_CSUM */ + nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_ZERO_CSUM6_TX */ + nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_ZERO_CSUM6_RX */ 0; }
@@@ -1315,6 -1400,14 +1400,14 @@@ static int geneve_fill_info(struct sk_b goto nla_put_failure; }
+ if (nla_put_u8(skb, IFLA_GENEVE_UDP_CSUM, + !!(geneve->flags & GENEVE_F_UDP_CSUM)) || + nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX, + !!(geneve->flags & GENEVE_F_UDP_ZERO_CSUM6_TX)) || + nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, + !!(geneve->flags & GENEVE_F_UDP_ZERO_CSUM6_RX))) + goto nla_put_failure; + return 0;
nla_put_failure: @@@ -1348,7 -1441,7 +1441,7 @@@ struct net_device *geneve_dev_create_fb return dev;
err = geneve_configure(net, dev, &geneve_remote_unspec, - 0, 0, 0, htons(dst_port), true); + 0, 0, 0, htons(dst_port), true, 0); if (err) { free_netdev(dev); return ERR_PTR(err); diff --combined drivers/net/phy/micrel.c index 7a56799,0dbc649..03833db --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@@ -73,6 -73,17 +73,17 @@@
#define PS_TO_REG 200
+ struct kszphy_hw_stat { + const char *string; + u8 reg; + u8 bits; + }; + + static struct kszphy_hw_stat kszphy_hw_stats[] = { + { "phy_receive_errors", 21, 16}, + { "phy_idle_errors", 10, 8 }, + }; + struct kszphy_type { u32 led_mode_reg; u16 interrupt_level_mask; @@@ -86,6 -97,7 +97,7 @@@ struct kszphy_priv int led_mode; bool rmii_ref_clk_sel; bool rmii_ref_clk_sel_val; + u64 stats[ARRAY_SIZE(kszphy_hw_stats)]; };
static const struct kszphy_type ksz8021_type = { @@@ -212,7 -224,7 +224,7 @@@ static int kszphy_setup_led(struct phy_ rc = phy_write(phydev, reg, temp); out: if (rc < 0) - dev_err(&phydev->dev, "failed to set led mode\n"); + phydev_err(phydev, "failed to set led mode\n");
return rc; } @@@ -231,7 -243,7 +243,7 @@@ static int kszphy_broadcast_disable(str ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); out: if (ret) - dev_err(&phydev->dev, "failed to disable broadcast address\n"); + phydev_err(phydev, "failed to disable broadcast address\n");
return ret; } @@@ -251,7 -263,7 +263,7 @@@ static int kszphy_nand_tree_disable(str ret & ~KSZPHY_OMSO_NAND_TREE_ON); out: if (ret) - dev_err(&phydev->dev, "failed to disable NAND tree mode\n"); + phydev_err(phydev, "failed to disable NAND tree mode\n");
return ret; } @@@ -276,7 -288,8 +288,8 @@@ static int kszphy_config_init(struct ph if (priv->rmii_ref_clk_sel) { ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); if (ret) { - dev_err(&phydev->dev, "failed to set rmii reference clock\n"); + phydev_err(phydev, + "failed to set rmii reference clock\n"); return ret; } } @@@ -337,7 -350,7 +350,7 @@@ static int ksz9021_load_values_from_of(
static int ksz9021_config_init(struct phy_device *phydev) { - const struct device *dev = &phydev->dev; + const struct device *dev = &phydev->mdio.dev; const struct device_node *of_node = dev->of_node; const struct device *dev_walker;
@@@ -345,7 -358,7 +358,7 @@@ * properties in the MAC node. Walk up the tree of devices to * find a device with an OF node. */ - dev_walker = &phydev->dev; + dev_walker = &phydev->mdio.dev; do { of_node = dev_walker->of_node; dev_walker = dev_walker->parent; @@@ -458,7 -471,7 +471,7 @@@ static int ksz9031_center_flp_timing(st
static int ksz9031_config_init(struct phy_device *phydev) { - const struct device *dev = &phydev->dev; + const struct device *dev = &phydev->mdio.dev; const struct device_node *of_node = dev->of_node; static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; static const char *rx_data_skews[4] = { @@@ -470,17 -483,9 +483,17 @@@ "txd2-skew-ps", "txd3-skew-ps" }; static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; + const struct device *dev_walker;
- if (!of_node && dev->parent->of_node) - of_node = dev->parent->of_node; + /* The Micrel driver has a deprecated option to place phy OF + * properties in the MAC node. Walk up the tree of devices to + * find a device with an OF node. + */ - dev_walker = &phydev->dev; ++ dev_walker = &phydev->mdio.dev; + do { + of_node = dev_walker->of_node; + dev_walker = dev_walker->parent; + } while (!of_node && dev_walker);
if (of_node) { ksz9031_of_load_skew_values(phydev, of_node, @@@ -577,15 -582,60 +590,60 @@@ ksz9021_wr_mmd_phyreg(struct phy_devic { }
+ static int kszphy_get_sset_count(struct phy_device *phydev) + { + return ARRAY_SIZE(kszphy_hw_stats); + } + + static void kszphy_get_strings(struct phy_device *phydev, u8 *data) + { + int i; + + for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++) { + memcpy(data + i * ETH_GSTRING_LEN, + kszphy_hw_stats[i].string, ETH_GSTRING_LEN); + } + } + + #ifndef UINT64_MAX + #define UINT64_MAX (u64)(~((u64)0)) + #endif + static u64 kszphy_get_stat(struct phy_device *phydev, int i) + { + struct kszphy_hw_stat stat = kszphy_hw_stats[i]; + struct kszphy_priv *priv = phydev->priv; + u64 val; + + val = phy_read(phydev, stat.reg); + if (val < 0) { + val = UINT64_MAX; + } else { + val = val & ((1 << stat.bits) - 1); + priv->stats[i] += val; + val = priv->stats[i]; + } + + return val; + } + + static void kszphy_get_stats(struct phy_device *phydev, + struct ethtool_stats *stats, u64 *data) + { + int i; + + for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++) + data[i] = kszphy_get_stat(phydev, i); + } + static int kszphy_probe(struct phy_device *phydev) { const struct kszphy_type *type = phydev->drv->driver_data; - const struct device_node *np = phydev->dev.of_node; + const struct device_node *np = phydev->mdio.dev.of_node; struct kszphy_priv *priv; struct clk *clk; int ret;
- priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL); + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM;
@@@ -600,15 -650,15 +658,15 @@@ priv->led_mode = -1;
if (priv->led_mode > 3) { - dev_err(&phydev->dev, "invalid led mode: 0x%02x\n", - priv->led_mode); + phydev_err(phydev, "invalid led mode: 0x%02x\n", + priv->led_mode); priv->led_mode = -1; } } else { priv->led_mode = -1; }
- clk = devm_clk_get(&phydev->dev, "rmii-ref"); + clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); /* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */ if (!IS_ERR_OR_NULL(clk)) { unsigned long rate = clk_get_rate(clk); @@@ -623,7 -673,8 +681,8 @@@ } else if (rate > 49500000 && rate < 50500000) { priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz; } else { - dev_err(&phydev->dev, "Clock rate out of range: %ld\n", rate); + phydev_err(phydev, "Clock rate out of range: %ld\n", + rate); return -EINVAL; } } @@@ -650,9 -701,11 +709,11 @@@ static struct phy_driver ksphy_driver[ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8021, .phy_id_mask = 0x00ffffff, @@@ -667,9 -720,11 +728,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8031, .phy_id_mask = 0x00ffffff, @@@ -684,9 -739,11 +747,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8041, .phy_id_mask = 0x00fffff0, @@@ -701,9 -758,11 +766,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8041RNLI, .phy_id_mask = 0x00fffff0, @@@ -718,9 -777,11 +785,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8051, .phy_id_mask = 0x00fffff0, @@@ -735,9 -796,11 +804,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8001, .name = "Micrel KSZ8001 or KS8721", @@@ -751,9 -814,11 +822,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8081, .name = "Micrel KSZ8081 or KSZ8091", @@@ -767,9 -832,11 +840,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ8061, .name = "Micrel KSZ8061", @@@ -781,9 -848,11 +856,11 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE,}, }, { .phy_id = PHY_ID_KSZ9021, .phy_id_mask = 0x000ffffe, @@@ -796,11 -865,13 +873,13 @@@ .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, .read_mmd_indirect = ksz9021_rd_mmd_phyreg, .write_mmd_indirect = ksz9021_wr_mmd_phyreg, - .driver = { .owner = THIS_MODULE, }, }, { .phy_id = PHY_ID_KSZ9031, .phy_id_mask = 0x00fffff0, @@@ -813,9 -884,11 +892,11 @@@ .read_status = ksz9031_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE, }, }, { .phy_id = PHY_ID_KSZ8873MLL, .phy_id_mask = 0x00fffff0, @@@ -825,9 -898,11 +906,11 @@@ .config_init = kszphy_config_init, .config_aneg = ksz8873mll_config_aneg, .read_status = ksz8873mll_read_status, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE, }, }, { .phy_id = PHY_ID_KSZ886X, .phy_id_mask = 0x00fffff0, @@@ -837,9 -912,11 +920,11 @@@ .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, + .get_sset_count = kszphy_get_sset_count, + .get_strings = kszphy_get_strings, + .get_stats = kszphy_get_stats, .suspend = genphy_suspend, .resume = genphy_resume, - .driver = { .owner = THIS_MODULE, }, } };
module_phy_driver(ksphy_driver); diff --combined drivers/net/usb/lan78xx.c index d54f536,1662b7b..2ed5333 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@@ -603,59 -603,6 +603,59 @@@ static int lan78xx_read_raw_otp(struct return 0; }
+static int lan78xx_write_raw_otp(struct lan78xx_net *dev, u32 offset, + u32 length, u8 *data) +{ + int i; + int ret; + u32 buf; + unsigned long timeout; + + ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf); + + if (buf & OTP_PWR_DN_PWRDN_N_) { + /* clear it and wait to be cleared */ + ret = lan78xx_write_reg(dev, OTP_PWR_DN, 0); + + timeout = jiffies + HZ; + do { + udelay(1); + ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf); + if (time_after(jiffies, timeout)) { + netdev_warn(dev->net, + "timeout on OTP_PWR_DN completion"); + return -EIO; + } + } while (buf & OTP_PWR_DN_PWRDN_N_); + } + + /* set to BYTE program mode */ + ret = lan78xx_write_reg(dev, OTP_PRGM_MODE, OTP_PRGM_MODE_BYTE_); + + for (i = 0; i < length; i++) { + ret = lan78xx_write_reg(dev, OTP_ADDR1, + ((offset + i) >> 8) & OTP_ADDR1_15_11); + ret = lan78xx_write_reg(dev, OTP_ADDR2, + ((offset + i) & OTP_ADDR2_10_3)); + ret = lan78xx_write_reg(dev, OTP_PRGM_DATA, data[i]); + ret = lan78xx_write_reg(dev, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_); + ret = lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_); + + timeout = jiffies + HZ; + do { + udelay(1); + ret = lan78xx_read_reg(dev, OTP_STATUS, &buf); + if (time_after(jiffies, timeout)) { + netdev_warn(dev->net, + "Timeout on OTP_STATUS completion"); + return -EIO; + } + } while (buf & OTP_STATUS_BUSY_); + } + + return 0; +} + static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset, u32 length, u8 *data) { @@@ -1022,7 -969,7 +1022,7 @@@ static int lan78xx_ethtool_set_eeprom(s (ee->offset == 0) && (ee->len == 512) && (data[0] == OTP_INDICATOR_1)) - return lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data); + return lan78xx_write_raw_otp(dev, ee->offset, ee->len, data);
return -EINVAL; } @@@ -1511,12 -1458,6 +1511,6 @@@ static int lan78xx_mdio_init(struct lan snprintf(dev->mdiobus->id, MII_BUS_ID_SIZE, "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum);
- dev->mdiobus->irq = kzalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); - if (!dev->mdiobus->irq) { - ret = -ENOMEM; - goto exit1; - } - /* handle our own interrupt */ for (i = 0; i < PHY_MAX_ADDR; i++) dev->mdiobus->irq[i] = PHY_IGNORE_INTERRUPT; @@@ -1532,13 -1473,11 +1526,11 @@@ ret = mdiobus_register(dev->mdiobus); if (ret) { netdev_err(dev->net, "can't register MDIO bus\n"); - goto exit2; + goto exit1; }
netdev_dbg(dev->net, "registered mdiobus bus %s\n", dev->mdiobus->id); return 0; - exit2: - kfree(dev->mdiobus->irq); exit1: mdiobus_free(dev->mdiobus); return ret; @@@ -1547,7 -1486,6 +1539,6 @@@ static void lan78xx_remove_mdio(struct lan78xx_net *dev) { mdiobus_unregister(dev->mdiobus); - kfree(dev->mdiobus->irq); mdiobus_free(dev->mdiobus); }
diff --combined drivers/net/usb/r8152.c index ef9aab6,230c73c..d1f78c2 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@@ -25,13 -25,12 +25,13 @@@ #include <uapi/linux/mdio.h> #include <linux/mdio.h> #include <linux/usb/cdc.h> +#include <linux/suspend.h>
/* Information for net-next */ #define NETNEXT_VERSION "08"
/* Information for net */ -#define NET_VERSION "2" +#define NET_VERSION "3"
#define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION #define DRIVER_AUTHOR "Realtek linux nic maintainers nic_swsd@realtek.com" @@@ -605,9 -604,6 +605,9 @@@ struct r8152 struct delayed_work schedule; struct mii_if_info mii; struct mutex control; /* use for hw setting */ +#ifdef CONFIG_PM_SLEEP + struct notifier_block pm_notifier; +#endif
struct rtl_ops { void (*init)(struct r8152 *); @@@ -1942,7 -1938,6 +1942,6 @@@ static void _rtl8152_set_rx_mode(struc __le32 tmp[2]; u32 ocp_data;
- clear_bit(RTL8152_SET_RX_MODE, &tp->flags); netif_stop_queue(netdev); ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); ocp_data &= ~RCR_ACPT_ALL; @@@ -1990,7 -1985,7 +1989,7 @@@ rtl8152_features_check(struct sk_buff * int offset = skb_transport_offset(skb);
if ((mss || skb->ip_summed == CHECKSUM_PARTIAL) && offset > max_offset) - features &= ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); + features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); else if ((skb->len + sizeof(struct tx_desc)) > agg_buf_sz) features &= ~NETIF_F_GSO_MASK;
@@@ -2428,8 -2423,6 +2427,6 @@@ static void rtl_phy_reset(struct r8152 u16 data; int i;
- clear_bit(PHY_RESET, &tp->flags); - data = r8152_mdio_read(tp, MII_BMCR);
/* don't reset again before the previous one complete */ @@@ -2459,23 -2452,23 +2456,23 @@@ static void r8153_teredo_off(struct r81 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); }
- static void r8152b_disable_aldps(struct r8152 *tp) - { - ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPDNPS | LINKENA | DIS_SDSAVE); - msleep(20); - } - - static inline void r8152b_enable_aldps(struct r8152 *tp) + static void r8152_aldps_en(struct r8152 *tp, bool enable) { - ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPWRSAVE | ENPDNPS | - LINKENA | DIS_SDSAVE); + if (enable) { + ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPWRSAVE | ENPDNPS | + LINKENA | DIS_SDSAVE); + } else { + ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPDNPS | LINKENA | + DIS_SDSAVE); + msleep(20); + } }
static void rtl8152_disable(struct r8152 *tp) { - r8152b_disable_aldps(tp); + r8152_aldps_en(tp, false); rtl_disable(tp); - r8152b_enable_aldps(tp); + r8152_aldps_en(tp, true); }
static void r8152b_hw_phy_cfg(struct r8152 *tp) @@@ -2787,30 -2780,26 +2784,26 @@@ static void r8153_enter_oob(struct r815 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); }
- static void r8153_disable_aldps(struct r8152 *tp) + static void r8153_aldps_en(struct r8152 *tp, bool enable) { u16 data;
data = ocp_reg_read(tp, OCP_POWER_CFG); - data &= ~EN_ALDPS; - ocp_reg_write(tp, OCP_POWER_CFG, data); - msleep(20); - } - - static void r8153_enable_aldps(struct r8152 *tp) - { - u16 data; - - data = ocp_reg_read(tp, OCP_POWER_CFG); - data |= EN_ALDPS; - ocp_reg_write(tp, OCP_POWER_CFG, data); + if (enable) { + data |= EN_ALDPS; + ocp_reg_write(tp, OCP_POWER_CFG, data); + } else { + data &= ~EN_ALDPS; + ocp_reg_write(tp, OCP_POWER_CFG, data); + msleep(20); + } }
static void rtl8153_disable(struct r8152 *tp) { - r8153_disable_aldps(tp); + r8153_aldps_en(tp, false); rtl_disable(tp); - r8153_enable_aldps(tp); + r8153_aldps_en(tp, true); usb_enable_lpm(tp->udev); }
@@@ -2888,10 -2877,9 +2881,9 @@@ static int rtl8152_set_speed(struct r81 r8152_mdio_write(tp, MII_ADVERTISE, anar); r8152_mdio_write(tp, MII_BMCR, bmcr);
- if (test_bit(PHY_RESET, &tp->flags)) { + if (test_and_clear_bit(PHY_RESET, &tp->flags)) { int i;
- clear_bit(PHY_RESET, &tp->flags); for (i = 0; i < 50; i++) { msleep(20); if ((r8152_mdio_read(tp, MII_BMCR) & BMCR_RESET) == 0) @@@ -2900,7 -2888,6 +2892,6 @@@ }
out: - return ret; }
@@@ -2909,9 -2896,9 +2900,9 @@@ static void rtl8152_up(struct r8152 *tp if (test_bit(RTL8152_UNPLUG, &tp->flags)) return;
- r8152b_disable_aldps(tp); + r8152_aldps_en(tp, false); r8152b_exit_oob(tp); - r8152b_enable_aldps(tp); + r8152_aldps_en(tp, true); }
static void rtl8152_down(struct r8152 *tp) @@@ -2922,9 -2909,9 +2913,9 @@@ }
r8152_power_cut_en(tp, false); - r8152b_disable_aldps(tp); + r8152_aldps_en(tp, false); r8152b_enter_oob(tp); - r8152b_enable_aldps(tp); + r8152_aldps_en(tp, true); }
static void rtl8153_up(struct r8152 *tp) @@@ -2933,9 -2920,9 +2924,9 @@@ return;
r8153_u1u2en(tp, false); - r8153_disable_aldps(tp); + r8153_aldps_en(tp, false); r8153_first_init(tp); - r8153_enable_aldps(tp); + r8153_aldps_en(tp, true); r8153_u2p3en(tp, true); r8153_u1u2en(tp, true); usb_enable_lpm(tp->udev); @@@ -2951,9 -2938,9 +2942,9 @@@ static void rtl8153_down(struct r8152 * r8153_u1u2en(tp, false); r8153_u2p3en(tp, false); r8153_power_cut_en(tp, false); - r8153_disable_aldps(tp); + r8153_aldps_en(tp, false); r8153_enter_oob(tp); - r8153_enable_aldps(tp); + r8153_aldps_en(tp, true); }
static bool rtl8152_in_nway(struct r8152 *tp) @@@ -2987,7 -2974,6 +2978,6 @@@ static void set_carrier(struct r8152 *t struct net_device *netdev = tp->netdev; u8 speed;
- clear_bit(RTL8152_LINK_CHG, &tp->flags); speed = rtl8152_get_speed(tp);
if (speed & LINK_STATUS) { @@@ -3030,20 -3016,18 +3020,18 @@@ static void rtl_work_func_t(struct work goto out1; }
- if (test_bit(RTL8152_LINK_CHG, &tp->flags)) + if (test_and_clear_bit(RTL8152_LINK_CHG, &tp->flags)) set_carrier(tp);
- if (test_bit(RTL8152_SET_RX_MODE, &tp->flags)) + if (test_and_clear_bit(RTL8152_SET_RX_MODE, &tp->flags)) _rtl8152_set_rx_mode(tp->netdev);
/* don't schedule napi before linking */ - if (test_bit(SCHEDULE_NAPI, &tp->flags) && - netif_carrier_ok(tp->netdev)) { - clear_bit(SCHEDULE_NAPI, &tp->flags); + if (test_and_clear_bit(SCHEDULE_NAPI, &tp->flags) && + netif_carrier_ok(tp->netdev)) napi_schedule(&tp->napi); - }
- if (test_bit(PHY_RESET, &tp->flags)) + if (test_and_clear_bit(PHY_RESET, &tp->flags)) rtl_phy_reset(tp);
mutex_unlock(&tp->control); @@@ -3052,33 -3036,6 +3040,33 @@@ out1 usb_autopm_put_interface(tp->intf); }
+#ifdef CONFIG_PM_SLEEP +static int rtl_notifier(struct notifier_block *nb, unsigned long action, + void *data) +{ + struct r8152 *tp = container_of(nb, struct r8152, pm_notifier); + + switch (action) { + case PM_HIBERNATION_PREPARE: + case PM_SUSPEND_PREPARE: + usb_autopm_get_interface(tp->intf); + break; + + case PM_POST_HIBERNATION: + case PM_POST_SUSPEND: + usb_autopm_put_interface(tp->intf); + break; + + case PM_POST_RESTORE: + case PM_RESTORE_PREPARE: + default: + break; + } + + return NOTIFY_DONE; +} +#endif + static int rtl8152_open(struct net_device *netdev) { struct r8152 *tp = netdev_priv(netdev); @@@ -3121,10 -3078,6 +3109,10 @@@ mutex_unlock(&tp->control);
usb_autopm_put_interface(tp->intf); +#ifdef CONFIG_PM_SLEEP + tp->pm_notifier.notifier_call = rtl_notifier; + register_pm_notifier(&tp->pm_notifier); +#endif
out: return res; @@@ -3135,9 -3088,6 +3123,9 @@@ static int rtl8152_close(struct net_dev struct r8152 *tp = netdev_priv(netdev); int res = 0;
+#ifdef CONFIG_PM_SLEEP + unregister_pm_notifier(&tp->pm_notifier); +#endif napi_disable(&tp->napi); clear_bit(WORK_ENABLE, &tp->flags); usb_kill_urb(tp->intr_urb); @@@ -3276,7 -3226,7 +3264,7 @@@ static void r8152b_init(struct r8152 *t if (test_bit(RTL8152_UNPLUG, &tp->flags)) return;
- r8152b_disable_aldps(tp); + r8152_aldps_en(tp, false);
if (tp->version == RTL_VER_01) { ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); @@@ -3298,7 -3248,7 +3286,7 @@@ ocp_write_word(tp, MCU_TYPE_PLA, PLA_GPHY_INTR_IMR, ocp_data);
r8152b_enable_eee(tp); - r8152b_enable_aldps(tp); + r8152_aldps_en(tp, true); r8152b_enable_fc(tp); rtl_tally_reset(tp);
@@@ -3316,7 -3266,7 +3304,7 @@@ static void r8153_init(struct r8152 *tp if (test_bit(RTL8152_UNPLUG, &tp->flags)) return;
- r8153_disable_aldps(tp); + r8153_aldps_en(tp, false); r8153_u1u2en(tp, false);
for (i = 0; i < 500; i++) { @@@ -3405,7 -3355,7 +3393,7 @@@ EEE_SPDWN_EN);
r8153_enable_eee(tp); - r8153_enable_aldps(tp); + r8153_aldps_en(tp, true); r8152b_enable_fc(tp); rtl_tally_reset(tp); r8153_u2p3en(tp, true); diff --combined drivers/net/vxlan.c index e1e147f,fecf7b6..2d88c79 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@@ -621,7 -621,7 +621,7 @@@ static void vxlan_notify_add_rx_port(st int err;
if (sa_family == AF_INET) { - err = udp_add_offload(&vs->udp_offloads); + err = udp_add_offload(net, &vs->udp_offloads); if (err) pr_warn("vxlan: udp_add_offload failed with status %d\n", err); } @@@ -1841,9 -1841,10 +1841,10 @@@ static int vxlan_xmit_skb(struct rtabl
skb_set_inner_protocol(skb, htons(ETH_P_TEB));
- return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, - ttl, df, src_port, dst_port, xnet, - !(vxflags & VXLAN_F_UDP_CSUM)); + udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df, + src_port, dst_port, xnet, + !(vxflags & VXLAN_F_UDP_CSUM)); + return 0; }
#if IS_ENABLED(CONFIG_IPV6) @@@ -2056,8 -2057,6 +2057,6 @@@ static void vxlan_xmit_one(struct sk_bu skb = NULL; goto rt_tx_error; } - - iptunnel_xmit_stats(err, &dev->stats, dev->tstats); #if IS_ENABLED(CONFIG_IPV6) } else { struct dst_entry *ndst; @@@ -2751,7 -2750,7 +2750,7 @@@ static int vxlan_dev_configure(struct n struct vxlan_config *conf) { struct vxlan_net *vn = net_generic(src_net, vxlan_net_id); - struct vxlan_dev *vxlan = netdev_priv(dev); + struct vxlan_dev *vxlan = netdev_priv(dev), *tmp; struct vxlan_rdst *dst = &vxlan->default_dst; unsigned short needed_headroom = ETH_HLEN; int err; @@@ -2817,15 -2816,9 +2816,15 @@@ if (!vxlan->cfg.age_interval) vxlan->cfg.age_interval = FDB_AGE_DEFAULT;
- if (vxlan_find_vni(src_net, conf->vni, use_ipv6 ? AF_INET6 : AF_INET, - vxlan->cfg.dst_port, vxlan->flags)) + list_for_each_entry(tmp, &vn->vxlan_list, next) { + if (tmp->cfg.vni == conf->vni && + (tmp->default_dst.remote_ip.sa.sa_family == AF_INET6 || + tmp->cfg.saddr.sa.sa_family == AF_INET6) == use_ipv6 && + tmp->cfg.dst_port == vxlan->cfg.dst_port && + (tmp->flags & VXLAN_F_RCV_FLAGS) == + (vxlan->flags & VXLAN_F_RCV_FLAGS)) return -EEXIST; + }
dev->ethtool_ops = &vxlan_ethtool_ops;
diff --combined drivers/net/wireless/marvell/libertas/debugfs.c index faed182,26cbf1d..faed182 --- a/drivers/net/wireless/marvell/libertas/debugfs.c +++ b/drivers/net/wireless/marvell/libertas/debugfs.c @@@ -56,15 -56,19 +56,15 @@@ static ssize_t lbs_sleepparams_write(st loff_t *ppos) { struct lbs_private *priv = file->private_data; - ssize_t buf_size, ret; + ssize_t ret; struct sleep_params sp; int p1, p2, p3, p4, p5, p6; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(user_buf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, user_buf, buf_size)) { - ret = -EFAULT; - goto out_unlock; - } ret = sscanf(buf, "%d %d %d %d %d %d", &p1, &p2, &p3, &p4, &p5, &p6); if (ret != 6) { ret = -EINVAL; @@@ -84,7 -88,7 +84,7 @@@ ret = -EINVAL;
out_unlock: - free_page(addr); + kfree(buf); return ret; }
@@@ -121,14 -125,18 +121,14 @@@ static ssize_t lbs_host_sleep_write(str loff_t *ppos) { struct lbs_private *priv = file->private_data; - ssize_t buf_size, ret; + ssize_t ret; int host_sleep; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(user_buf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, user_buf, buf_size)) { - ret = -EFAULT; - goto out_unlock; - } ret = sscanf(buf, "%d", &host_sleep); if (ret != 1) { ret = -EINVAL; @@@ -154,7 -162,7 +154,7 @@@ ret = count;
out_unlock: - free_page(addr); + kfree(buf); return ret; }
@@@ -273,15 -281,21 +273,15 @@@ static ssize_t lbs_threshold_write(uint struct cmd_ds_802_11_subscribe_event *events; struct mrvl_ie_thresholds *tlv; struct lbs_private *priv = file->private_data; - ssize_t buf_size; int value, freq, new_mask; uint16_t curr_mask; char *buf; int ret;
- buf = (char *)get_zeroed_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - ret = -EFAULT; - goto out_page; - } ret = sscanf(buf, "%d %d %d", &value, &freq, &new_mask); if (ret != 3) { ret = -EINVAL; @@@ -329,7 -343,7 +329,7 @@@ out_events: kfree(events); out_page: - free_page((unsigned long)buf); + kfree(buf); return ret; }
@@@ -458,15 -472,22 +458,15 @@@ static ssize_t lbs_rdmac_write(struct f size_t count, loff_t *ppos) { struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } priv->mac_offset = simple_strtoul(buf, NULL, 16); - res = count; -out_unlock: - free_page(addr); - return res; + kfree(buf); + return count; }
static ssize_t lbs_wrmac_write(struct file *file, @@@ -475,14 -496,18 +475,14 @@@ {
struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; + ssize_t res; u32 offset, value; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } res = sscanf(buf, "%x %x", &offset, &value); if (res != 2) { res = -EFAULT; @@@ -495,7 -520,7 +495,7 @@@ if (!res) res = count; out_unlock: - free_page(addr); + kfree(buf); return res; }
@@@ -529,16 -554,22 +529,16 @@@ static ssize_t lbs_rdbbp_write(struct f size_t count, loff_t *ppos) { struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } priv->bbp_offset = simple_strtoul(buf, NULL, 16); - res = count; -out_unlock: - free_page(addr); - return res; + kfree(buf); + + return count; }
static ssize_t lbs_wrbbp_write(struct file *file, @@@ -547,14 -578,18 +547,14 @@@ {
struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; + ssize_t res; u32 offset, value; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } res = sscanf(buf, "%x %x", &offset, &value); if (res != 2) { res = -EFAULT; @@@ -567,7 -602,7 +567,7 @@@ if (!res) res = count; out_unlock: - free_page(addr); + kfree(buf); return res; }
@@@ -601,15 -636,22 +601,15 @@@ static ssize_t lbs_rdrf_write(struct fi size_t count, loff_t *ppos) { struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } priv->rf_offset = simple_strtoul(buf, NULL, 16); - res = count; -out_unlock: - free_page(addr); - return res; + kfree(buf); + return count; }
static ssize_t lbs_wrrf_write(struct file *file, @@@ -618,14 -660,18 +618,14 @@@ {
struct lbs_private *priv = file->private_data; - ssize_t res, buf_size; + ssize_t res; u32 offset, value; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - if (!buf) - return -ENOMEM; + char *buf; + + buf = memdup_user_nul(userbuf, min(count, len - 1)); + if (IS_ERR(buf)) + return PTR_ERR(buf);
- buf_size = min(count, len - 1); - if (copy_from_user(buf, userbuf, buf_size)) { - res = -EFAULT; - goto out_unlock; - } res = sscanf(buf, "%x %x", &offset, &value); if (res != 2) { res = -EFAULT; @@@ -638,7 -684,7 +638,7 @@@ if (!res) res = count; out_unlock: - free_page(addr); + kfree(buf); return res; }
@@@ -869,9 -915,16 +869,9 @@@ static ssize_t lbs_debugfs_write(struc if (cnt == 0) return 0;
- pdata = kmalloc(cnt + 1, GFP_KERNEL); - if (pdata == NULL) - return 0; - - if (copy_from_user(pdata, buf, cnt)) { - lbs_deb_debugfs("Copy from user failed\n"); - kfree(pdata); - return 0; - } - pdata[cnt] = '\0'; + pdata = memdup_user_nul(buf, cnt); + if (IS_ERR(pdata)) + return PTR_ERR(pdata);
p0 = pdata; for (i = 0; i < num_of_items; i++) { diff --combined drivers/net/wireless/marvell/mwifiex/debugfs.c index 0000000,5e55629..0b9c580 mode 000000,100644..100644 --- a/drivers/net/wireless/marvell/mwifiex/debugfs.c +++ b/drivers/net/wireless/marvell/mwifiex/debugfs.c @@@ -1,0 -1,1035 +1,1003 @@@ + /* + * Marvell Wireless LAN device driver: debugfs + * + * Copyright (C) 2011-2014, Marvell International Ltd. + * + * This software file (the "File") is distributed by Marvell International + * Ltd. under the terms of the GNU General Public License Version 2, June 1991 + * (the "License"). You may use, redistribute and/or modify this File in + * accordance with the terms and conditions of the License, a copy of which + * is available by writing to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the + * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + * + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about + * this warranty disclaimer. + */ + + #include <linux/debugfs.h> + + #include "main.h" + #include "11n.h" + + + static struct dentry *mwifiex_dfs_dir; + + static char *bss_modes[] = { + "UNSPECIFIED", + "ADHOC", + "STATION", + "AP", + "AP_VLAN", + "WDS", + "MONITOR", + "MESH_POINT", + "P2P_CLIENT", + "P2P_GO", + "P2P_DEVICE", + }; + + /* + * Proc info file read handler. + * + * This function is called when the 'info' file is opened for reading. + * It prints the following driver related information - + * - Driver name + * - Driver version + * - Driver extended version + * - Interface name + * - BSS mode + * - Media state (connected or disconnected) + * - MAC address + * - Total number of Tx bytes + * - Total number of Rx bytes + * - Total number of Tx packets + * - Total number of Rx packets + * - Total number of dropped Tx packets + * - Total number of dropped Rx packets + * - Total number of corrupted Tx packets + * - Total number of corrupted Rx packets + * - Carrier status (on or off) + * - Tx queue status (started or stopped) + * + * For STA mode drivers, it also prints the following extra - + * - ESSID + * - BSSID + * - Channel + * - Region code + * - Multicast count + * - Multicast addresses + */ + static ssize_t + mwifiex_info_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *) file->private_data; + struct net_device *netdev = priv->netdev; + struct netdev_hw_addr *ha; + struct netdev_queue *txq; + unsigned long page = get_zeroed_page(GFP_KERNEL); + char *p = (char *) page, fmt[64]; + struct mwifiex_bss_info info; + ssize_t ret; + int i = 0; + + if (!p) + return -ENOMEM; + + memset(&info, 0, sizeof(info)); + ret = mwifiex_get_bss_info(priv, &info); + if (ret) + goto free_and_exit; + + mwifiex_drv_get_driver_version(priv->adapter, fmt, sizeof(fmt) - 1); + + if (!priv->version_str[0]) + mwifiex_get_ver_ext(priv); + + p += sprintf(p, "driver_name = " ""mwifiex"\n"); + p += sprintf(p, "driver_version = %s", fmt); + p += sprintf(p, "\nverext = %s", priv->version_str); + p += sprintf(p, "\ninterface_name="%s"\n", netdev->name); + + if (info.bss_mode >= ARRAY_SIZE(bss_modes)) + p += sprintf(p, "bss_mode="%d"\n", info.bss_mode); + else + p += sprintf(p, "bss_mode="%s"\n", bss_modes[info.bss_mode]); + + p += sprintf(p, "media_state="%s"\n", + (!priv->media_connected ? "Disconnected" : "Connected")); + p += sprintf(p, "mac_address="%pM"\n", netdev->dev_addr); + + if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) { + p += sprintf(p, "multicast_count="%d"\n", + netdev_mc_count(netdev)); + p += sprintf(p, "essid="%s"\n", info.ssid.ssid); + p += sprintf(p, "bssid="%pM"\n", info.bssid); + p += sprintf(p, "channel="%d"\n", (int) info.bss_chan); + p += sprintf(p, "country_code = "%s"\n", info.country_code); + + netdev_for_each_mc_addr(ha, netdev) + p += sprintf(p, "multicast_address[%d]="%pM"\n", + i++, ha->addr); + } + + p += sprintf(p, "num_tx_bytes = %lu\n", priv->stats.tx_bytes); + p += sprintf(p, "num_rx_bytes = %lu\n", priv->stats.rx_bytes); + p += sprintf(p, "num_tx_pkts = %lu\n", priv->stats.tx_packets); + p += sprintf(p, "num_rx_pkts = %lu\n", priv->stats.rx_packets); + p += sprintf(p, "num_tx_pkts_dropped = %lu\n", priv->stats.tx_dropped); + p += sprintf(p, "num_rx_pkts_dropped = %lu\n", priv->stats.rx_dropped); + p += sprintf(p, "num_tx_pkts_err = %lu\n", priv->stats.tx_errors); + p += sprintf(p, "num_rx_pkts_err = %lu\n", priv->stats.rx_errors); + p += sprintf(p, "carrier %s\n", ((netif_carrier_ok(priv->netdev)) + ? "on" : "off")); + p += sprintf(p, "tx queue"); + for (i = 0; i < netdev->num_tx_queues; i++) { + txq = netdev_get_tx_queue(netdev, i); + p += sprintf(p, " %d:%s", i, netif_tx_queue_stopped(txq) ? + "stopped" : "started"); + } + p += sprintf(p, "\n"); + + ret = simple_read_from_buffer(ubuf, count, ppos, (char *) page, + (unsigned long) p - page); + + free_and_exit: + free_page(page); + return ret; + } + + /* + * Proc device dump read handler. + * + * This function is called when the 'device_dump' file is opened for + * reading. + * This function dumps driver information and firmware memory segments + * (ex. DTCM, ITCM, SQRAM etc.) for + * debugging. + */ + static ssize_t + mwifiex_device_dump_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = file->private_data; + + if (!priv->adapter->if_ops.device_dump) + return -EIO; + + priv->adapter->if_ops.device_dump(priv->adapter); + + return 0; + } + + /* + * Proc getlog file read handler. + * + * This function is called when the 'getlog' file is opened for reading + * It prints the following log information - + * - Number of multicast Tx frames + * - Number of failed packets + * - Number of Tx retries + * - Number of multicast Tx retries + * - Number of duplicate frames + * - Number of RTS successes + * - Number of RTS failures + * - Number of ACK failures + * - Number of fragmented Rx frames + * - Number of multicast Rx frames + * - Number of FCS errors + * - Number of Tx frames + * - WEP ICV error counts + * - Number of received beacons + * - Number of missed beacons + */ + static ssize_t + mwifiex_getlog_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *) file->private_data; + unsigned long page = get_zeroed_page(GFP_KERNEL); + char *p = (char *) page; + ssize_t ret; + struct mwifiex_ds_get_stats stats; + + if (!p) + return -ENOMEM; + + memset(&stats, 0, sizeof(stats)); + ret = mwifiex_get_stats_info(priv, &stats); + if (ret) + goto free_and_exit; + + p += sprintf(p, "\n" + "mcasttxframe %u\n" + "failed %u\n" + "retry %u\n" + "multiretry %u\n" + "framedup %u\n" + "rtssuccess %u\n" + "rtsfailure %u\n" + "ackfailure %u\n" + "rxfrag %u\n" + "mcastrxframe %u\n" + "fcserror %u\n" + "txframe %u\n" + "wepicverrcnt-1 %u\n" + "wepicverrcnt-2 %u\n" + "wepicverrcnt-3 %u\n" + "wepicverrcnt-4 %u\n" + "bcn_rcv_cnt %u\n" + "bcn_miss_cnt %u\n", + stats.mcast_tx_frame, + stats.failed, + stats.retry, + stats.multi_retry, + stats.frame_dup, + stats.rts_success, + stats.rts_failure, + stats.ack_failure, + stats.rx_frag, + stats.mcast_rx_frame, + stats.fcs_error, + stats.tx_frame, + stats.wep_icv_error[0], + stats.wep_icv_error[1], + stats.wep_icv_error[2], + stats.wep_icv_error[3], + stats.bcn_rcv_cnt, + stats.bcn_miss_cnt); + + + ret = simple_read_from_buffer(ubuf, count, ppos, (char *) page, + (unsigned long) p - page); + + free_and_exit: + free_page(page); + return ret; + } + + /* Sysfs histogram file read handler. + * + * This function is called when the 'histogram' file is opened for reading + * It prints the following histogram information - + * - Number of histogram samples + * - Receive packet number of each rx_rate + * - Receive packet number of each snr + * - Receive packet number of each nosie_flr + * - Receive packet number of each signal streath + */ + static ssize_t + mwifiex_histogram_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *)file->private_data; + ssize_t ret; + struct mwifiex_histogram_data *phist_data; + int i, value; + unsigned long page = get_zeroed_page(GFP_KERNEL); + char *p = (char *)page; + + if (!p) + return -ENOMEM; + + if (!priv || !priv->hist_data) + return -EFAULT; + phist_data = priv->hist_data; + + p += sprintf(p, "\n" + "total samples = %d\n", + atomic_read(&phist_data->num_samples)); + + p += sprintf(p, "rx rates (in Mbps): 0=1M 1=2M"); + p += sprintf(p, "2=5.5M 3=11M 4=6M 5=9M 6=12M\n"); + p += sprintf(p, "7=18M 8=24M 9=36M 10=48M 11=54M"); + p += sprintf(p, "12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40)\n"); + + if (ISSUPP_11ACENABLED(priv->adapter->fw_cap_info)) { + p += sprintf(p, "44-53=MCS0-9(VHT:BW20)"); + p += sprintf(p, "54-63=MCS0-9(VHT:BW40)"); + p += sprintf(p, "64-73=MCS0-9(VHT:BW80)\n\n"); + } else { + p += sprintf(p, "\n"); + } + + for (i = 0; i < MWIFIEX_MAX_RX_RATES; i++) { + value = atomic_read(&phist_data->rx_rate[i]); + if (value) + p += sprintf(p, "rx_rate[%02d] = %d\n", i, value); + } + + if (ISSUPP_11ACENABLED(priv->adapter->fw_cap_info)) { + for (i = MWIFIEX_MAX_RX_RATES; i < MWIFIEX_MAX_AC_RX_RATES; + i++) { + value = atomic_read(&phist_data->rx_rate[i]); + if (value) + p += sprintf(p, "rx_rate[%02d] = %d\n", + i, value); + } + } + + for (i = 0; i < MWIFIEX_MAX_SNR; i++) { + value = atomic_read(&phist_data->snr[i]); + if (value) + p += sprintf(p, "snr[%02ddB] = %d\n", i, value); + } + for (i = 0; i < MWIFIEX_MAX_NOISE_FLR; i++) { + value = atomic_read(&phist_data->noise_flr[i]); + if (value) + p += sprintf(p, "noise_flr[-%02ddBm] = %d\n", + (int)(i-128), value); + } + for (i = 0; i < MWIFIEX_MAX_SIG_STRENGTH; i++) { + value = atomic_read(&phist_data->sig_str[i]); + if (value) + p += sprintf(p, "sig_strength[-%02ddBm] = %d\n", + i, value); + } + + ret = simple_read_from_buffer(ubuf, count, ppos, (char *)page, + (unsigned long)p - page); + + return ret; + } + + static ssize_t + mwifiex_histogram_write(struct file *file, const char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = (void *)file->private_data; + + if (priv && priv->hist_data) + mwifiex_hist_data_reset(priv); + return 0; + } + + static struct mwifiex_debug_info info; + + /* + * Proc debug file read handler. + * + * This function is called when the 'debug' file is opened for reading + * It prints the following log information - + * - Interrupt count + * - WMM AC VO packets count + * - WMM AC VI packets count + * - WMM AC BE packets count + * - WMM AC BK packets count + * - Maximum Tx buffer size + * - Tx buffer size + * - Current Tx buffer size + * - Power Save mode + * - Power Save state + * - Deep Sleep status + * - Device wakeup required status + * - Number of wakeup tries + * - Host Sleep configured status + * - Host Sleep activated status + * - Number of Tx timeouts + * - Number of command timeouts + * - Last timed out command ID + * - Last timed out command action + * - Last command ID + * - Last command action + * - Last command index + * - Last command response ID + * - Last command response index + * - Last event + * - Last event index + * - Number of host to card command failures + * - Number of sleep confirm command failures + * - Number of host to card data failure + * - Number of deauthentication events + * - Number of disassociation events + * - Number of link lost events + * - Number of deauthentication commands + * - Number of association success commands + * - Number of association failure commands + * - Number of commands sent + * - Number of data packets sent + * - Number of command responses received + * - Number of events received + * - Tx BA stream table (TID, RA) + * - Rx reorder table (TID, TA, Start window, Window size, Buffer) + */ + static ssize_t + mwifiex_debug_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *) file->private_data; + unsigned long page = get_zeroed_page(GFP_KERNEL); + char *p = (char *) page; + ssize_t ret; + + if (!p) + return -ENOMEM; + + ret = mwifiex_get_debug_info(priv, &info); + if (ret) + goto free_and_exit; + + p += mwifiex_debug_info_to_buffer(priv, p, &info); + + ret = simple_read_from_buffer(ubuf, count, ppos, (char *) page, + (unsigned long) p - page); + + free_and_exit: + free_page(page); + return ret; + } + + static u32 saved_reg_type, saved_reg_offset, saved_reg_value; + + /* + * Proc regrdwr file write handler. + * + * This function is called when the 'regrdwr' file is opened for writing + * + * This function can be used to write to a register. + */ + static ssize_t + mwifiex_regrdwr_write(struct file *file, + const char __user *ubuf, size_t count, loff_t *ppos) + { - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *) addr; - size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); ++ char *buf; + int ret; + u32 reg_type = 0, reg_offset = 0, reg_value = UINT_MAX; + - if (!buf) - return -ENOMEM; - - - if (copy_from_user(buf, ubuf, buf_size)) { - ret = -EFAULT; - goto done; - } ++ buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); ++ if (IS_ERR(buf)) ++ return PTR_ERR(buf); + + sscanf(buf, "%u %x %x", ®_type, ®_offset, ®_value); + + if (reg_type == 0 || reg_offset == 0) { + ret = -EINVAL; + goto done; + } else { + saved_reg_type = reg_type; + saved_reg_offset = reg_offset; + saved_reg_value = reg_value; + ret = count; + } + done: - free_page(addr); ++ kfree(buf); + return ret; + } + + /* + * Proc regrdwr file read handler. + * + * This function is called when the 'regrdwr' file is opened for reading + * + * This function can be used to read from a register. + */ + static ssize_t + mwifiex_regrdwr_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *) file->private_data; + unsigned long addr = get_zeroed_page(GFP_KERNEL); + char *buf = (char *) addr; + int pos = 0, ret = 0; + u32 reg_value; + + if (!buf) + return -ENOMEM; + + if (!saved_reg_type) { + /* No command has been given */ + pos += snprintf(buf, PAGE_SIZE, "0"); + goto done; + } + /* Set command has been given */ + if (saved_reg_value != UINT_MAX) { + ret = mwifiex_reg_write(priv, saved_reg_type, saved_reg_offset, + saved_reg_value); + + pos += snprintf(buf, PAGE_SIZE, "%u 0x%x 0x%x\n", + saved_reg_type, saved_reg_offset, + saved_reg_value); + + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + + goto done; + } + /* Get command has been given */ + ret = mwifiex_reg_read(priv, saved_reg_type, + saved_reg_offset, ®_value); + if (ret) { + ret = -EINVAL; + goto done; + } + + pos += snprintf(buf, PAGE_SIZE, "%u 0x%x 0x%x\n", saved_reg_type, + saved_reg_offset, reg_value); + + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + + done: + free_page(addr); + return ret; + } + + /* Proc debug_mask file read handler. + * This function is called when the 'debug_mask' file is opened for reading + * This function can be used read driver debugging mask value. + */ + static ssize_t + mwifiex_debug_mask_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *)file->private_data; + unsigned long page = get_zeroed_page(GFP_KERNEL); + char *buf = (char *)page; + size_t ret = 0; + int pos = 0; + + if (!buf) + return -ENOMEM; + + pos += snprintf(buf, PAGE_SIZE, "debug mask=0x%08x\n", + priv->adapter->debug_mask); + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + + free_page(page); + return ret; + } + + /* Proc debug_mask file read handler. + * This function is called when the 'debug_mask' file is opened for reading + * This function can be used read driver debugging mask value. + */ + static ssize_t + mwifiex_debug_mask_write(struct file *file, const char __user *ubuf, + size_t count, loff_t *ppos) + { + int ret; + unsigned long debug_mask; + struct mwifiex_private *priv = (void *)file->private_data; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (void *)addr; - size_t buf_size = min(count, (size_t)(PAGE_SIZE - 1)); ++ char *buf; + - if (!buf) - return -ENOMEM; - - if (copy_from_user(buf, ubuf, buf_size)) { - ret = -EFAULT; - goto done; - } ++ buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); ++ if (IS_ERR(buf)) ++ return PTR_ERR(buf); + + if (kstrtoul(buf, 0, &debug_mask)) { + ret = -EINVAL; + goto done; + } + + priv->adapter->debug_mask = debug_mask; + ret = count; + done: - free_page(addr); ++ kfree(buf); + return ret; + } + + /* Proc memrw file write handler. + * This function is called when the 'memrw' file is opened for writing + * This function can be used to write to a memory location. + */ + static ssize_t + mwifiex_memrw_write(struct file *file, const char __user *ubuf, size_t count, + loff_t *ppos) + { + int ret; + char cmd; + struct mwifiex_ds_mem_rw mem_rw; + u16 cmd_action; + struct mwifiex_private *priv = (void *)file->private_data; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (void *)addr; - size_t buf_size = min(count, (size_t)(PAGE_SIZE - 1)); - - if (!buf) - return -ENOMEM; ++ char *buf; + - if (copy_from_user(buf, ubuf, buf_size)) { - ret = -EFAULT; - goto done; - } ++ buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); ++ if (IS_ERR(buf)) ++ return PTR_ERR(buf); + + ret = sscanf(buf, "%c %x %x", &cmd, &mem_rw.addr, &mem_rw.value); + if (ret != 3) { + ret = -EINVAL; + goto done; + } + + if ((cmd == 'r') || (cmd == 'R')) { + cmd_action = HostCmd_ACT_GEN_GET; + mem_rw.value = 0; + } else if ((cmd == 'w') || (cmd == 'W')) { + cmd_action = HostCmd_ACT_GEN_SET; + } else { + ret = -EINVAL; + goto done; + } + + memcpy(&priv->mem_rw, &mem_rw, sizeof(mem_rw)); + if (mwifiex_send_cmd(priv, HostCmd_CMD_MEM_ACCESS, cmd_action, 0, + &mem_rw, true)) + ret = -1; + else + ret = count; + + done: - free_page(addr); ++ kfree(buf); + return ret; + } + + /* Proc memrw file read handler. + * This function is called when the 'memrw' file is opened for reading + * This function can be used to read from a memory location. + */ + static ssize_t + mwifiex_memrw_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = (void *)file->private_data; + unsigned long addr = get_zeroed_page(GFP_KERNEL); + char *buf = (char *)addr; + int ret, pos = 0; + + if (!buf) + return -ENOMEM; + + pos += snprintf(buf, PAGE_SIZE, "0x%x 0x%x\n", priv->mem_rw.addr, + priv->mem_rw.value); + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + + free_page(addr); + return ret; + } + + static u32 saved_offset = -1, saved_bytes = -1; + + /* + * Proc rdeeprom file write handler. + * + * This function is called when the 'rdeeprom' file is opened for writing + * + * This function can be used to write to a RDEEPROM location. + */ + static ssize_t + mwifiex_rdeeprom_write(struct file *file, + const char __user *ubuf, size_t count, loff_t *ppos) + { - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *) addr; - size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); ++ char *buf; + int ret = 0; + int offset = -1, bytes = -1; + - if (!buf) - return -ENOMEM; - - - if (copy_from_user(buf, ubuf, buf_size)) { - ret = -EFAULT; - goto done; - } ++ buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); ++ if (IS_ERR(buf)) ++ return PTR_ERR(buf); + + sscanf(buf, "%d %d", &offset, &bytes); + + if (offset == -1 || bytes == -1) { + ret = -EINVAL; + goto done; + } else { + saved_offset = offset; + saved_bytes = bytes; + ret = count; + } + done: - free_page(addr); ++ kfree(buf); + return ret; + } + + /* + * Proc rdeeprom read write handler. + * + * This function is called when the 'rdeeprom' file is opened for reading + * + * This function can be used to read from a RDEEPROM location. + */ + static ssize_t + mwifiex_rdeeprom_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = + (struct mwifiex_private *) file->private_data; + unsigned long addr = get_zeroed_page(GFP_KERNEL); + char *buf = (char *) addr; + int pos, ret, i; + u8 value[MAX_EEPROM_DATA]; + + if (!buf) + return -ENOMEM; + + if (saved_offset == -1) { + /* No command has been given */ + pos = snprintf(buf, PAGE_SIZE, "0"); + goto done; + } + + /* Get command has been given */ + ret = mwifiex_eeprom_read(priv, (u16) saved_offset, + (u16) saved_bytes, value); + if (ret) { + ret = -EINVAL; + goto out_free; + } + + pos = snprintf(buf, PAGE_SIZE, "%d %d ", saved_offset, saved_bytes); + + for (i = 0; i < saved_bytes; i++) + pos += scnprintf(buf + pos, PAGE_SIZE - pos, "%d ", value[i]); + + done: + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + out_free: + free_page(addr); + return ret; + } + + /* Proc hscfg file write handler + * This function can be used to configure the host sleep parameters. + */ + static ssize_t + mwifiex_hscfg_write(struct file *file, const char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = (void *)file->private_data; - unsigned long addr = get_zeroed_page(GFP_KERNEL); - char *buf = (char *)addr; - size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); ++ char *buf; + int ret, arg_num; + struct mwifiex_ds_hs_cfg hscfg; + int conditions = HS_CFG_COND_DEF; + u32 gpio = HS_CFG_GPIO_DEF, gap = HS_CFG_GAP_DEF; + - if (!buf) - return -ENOMEM; - - if (copy_from_user(buf, ubuf, buf_size)) { - ret = -EFAULT; - goto done; - } ++ buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); ++ if (IS_ERR(buf)) ++ return PTR_ERR(buf); + + arg_num = sscanf(buf, "%d %x %x", &conditions, &gpio, &gap); + + memset(&hscfg, 0, sizeof(struct mwifiex_ds_hs_cfg)); + + if (arg_num > 3) { + mwifiex_dbg(priv->adapter, ERROR, + "Too many arguments\n"); + ret = -EINVAL; + goto done; + } + + if (arg_num >= 1 && arg_num < 3) + mwifiex_set_hs_params(priv, HostCmd_ACT_GEN_GET, + MWIFIEX_SYNC_CMD, &hscfg); + + if (arg_num) { + if (conditions == HS_CFG_CANCEL) { + mwifiex_cancel_hs(priv, MWIFIEX_ASYNC_CMD); + ret = count; + goto done; + } + hscfg.conditions = conditions; + } + if (arg_num >= 2) + hscfg.gpio = gpio; + if (arg_num == 3) + hscfg.gap = gap; + + hscfg.is_invoke_hostcmd = false; + mwifiex_set_hs_params(priv, HostCmd_ACT_GEN_SET, + MWIFIEX_SYNC_CMD, &hscfg); + + mwifiex_enable_hs(priv->adapter); + priv->adapter->hs_enabling = false; + ret = count; + done: - free_page(addr); ++ kfree(buf); + return ret; + } + + /* Proc hscfg file read handler + * This function can be used to read host sleep configuration + * parameters from driver. + */ + static ssize_t + mwifiex_hscfg_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = (void *)file->private_data; + unsigned long addr = get_zeroed_page(GFP_KERNEL); + char *buf = (char *)addr; + int pos, ret; + struct mwifiex_ds_hs_cfg hscfg; + + if (!buf) + return -ENOMEM; + + mwifiex_set_hs_params(priv, HostCmd_ACT_GEN_GET, + MWIFIEX_SYNC_CMD, &hscfg); + + pos = snprintf(buf, PAGE_SIZE, "%u 0x%x 0x%x\n", hscfg.conditions, + hscfg.gpio, hscfg.gap); + + ret = simple_read_from_buffer(ubuf, count, ppos, buf, pos); + + free_page(addr); + return ret; + } + + static ssize_t + mwifiex_timeshare_coex_read(struct file *file, char __user *ubuf, + size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = file->private_data; + char buf[3]; + bool timeshare_coex; + int ret; + unsigned int len; + + if (priv->adapter->fw_api_ver != MWIFIEX_FW_V15) + return -EOPNOTSUPP; + + ret = mwifiex_send_cmd(priv, HostCmd_CMD_ROBUST_COEX, + HostCmd_ACT_GEN_GET, 0, ×hare_coex, true); + if (ret) + return ret; + + len = sprintf(buf, "%d\n", timeshare_coex); + return simple_read_from_buffer(ubuf, count, ppos, buf, len); + } + + static ssize_t + mwifiex_timeshare_coex_write(struct file *file, const char __user *ubuf, + size_t count, loff_t *ppos) + { + bool timeshare_coex; + struct mwifiex_private *priv = file->private_data; + char kbuf[16]; + int ret; + + if (priv->adapter->fw_api_ver != MWIFIEX_FW_V15) + return -EOPNOTSUPP; + + memset(kbuf, 0, sizeof(kbuf)); + + if (copy_from_user(&kbuf, ubuf, min_t(size_t, sizeof(kbuf) - 1, count))) + return -EFAULT; + + if (strtobool(kbuf, ×hare_coex)) + return -EINVAL; + + ret = mwifiex_send_cmd(priv, HostCmd_CMD_ROBUST_COEX, + HostCmd_ACT_GEN_SET, 0, ×hare_coex, true); + if (ret) + return ret; + else + return count; + } + + static ssize_t + mwifiex_reset_write(struct file *file, + const char __user *ubuf, size_t count, loff_t *ppos) + { + struct mwifiex_private *priv = file->private_data; + struct mwifiex_adapter *adapter = priv->adapter; + char cmd; + bool result; + + if (copy_from_user(&cmd, ubuf, sizeof(cmd))) + return -EFAULT; + + if (strtobool(&cmd, &result)) + return -EINVAL; + + if (!result) + return -EINVAL; + + if (adapter->if_ops.card_reset) { + dev_info(adapter->dev, "Resetting per request\n"); + adapter->hw_status = MWIFIEX_HW_STATUS_RESET; + mwifiex_cancel_all_pending_cmd(adapter); + adapter->if_ops.card_reset(adapter); + } + + return count; + } + + #define MWIFIEX_DFS_ADD_FILE(name) do { \ + if (!debugfs_create_file(#name, 0644, priv->dfs_dev_dir, \ + priv, &mwifiex_dfs_##name##_fops)) \ + return; \ + } while (0); + + #define MWIFIEX_DFS_FILE_OPS(name) \ + static const struct file_operations mwifiex_dfs_##name##_fops = { \ + .read = mwifiex_##name##_read, \ + .write = mwifiex_##name##_write, \ + .open = simple_open, \ + }; + + #define MWIFIEX_DFS_FILE_READ_OPS(name) \ + static const struct file_operations mwifiex_dfs_##name##_fops = { \ + .read = mwifiex_##name##_read, \ + .open = simple_open, \ + }; + + #define MWIFIEX_DFS_FILE_WRITE_OPS(name) \ + static const struct file_operations mwifiex_dfs_##name##_fops = { \ + .write = mwifiex_##name##_write, \ + .open = simple_open, \ + }; + + + MWIFIEX_DFS_FILE_READ_OPS(info); + MWIFIEX_DFS_FILE_READ_OPS(debug); + MWIFIEX_DFS_FILE_READ_OPS(getlog); + MWIFIEX_DFS_FILE_READ_OPS(device_dump); + MWIFIEX_DFS_FILE_OPS(regrdwr); + MWIFIEX_DFS_FILE_OPS(rdeeprom); + MWIFIEX_DFS_FILE_OPS(memrw); + MWIFIEX_DFS_FILE_OPS(hscfg); + MWIFIEX_DFS_FILE_OPS(histogram); + MWIFIEX_DFS_FILE_OPS(debug_mask); + MWIFIEX_DFS_FILE_OPS(timeshare_coex); + MWIFIEX_DFS_FILE_WRITE_OPS(reset); + + /* + * This function creates the debug FS directory structure and the files. + */ + void + mwifiex_dev_debugfs_init(struct mwifiex_private *priv) + { + if (!mwifiex_dfs_dir || !priv) + return; + + priv->dfs_dev_dir = debugfs_create_dir(priv->netdev->name, + mwifiex_dfs_dir); + + if (!priv->dfs_dev_dir) + return; + + MWIFIEX_DFS_ADD_FILE(info); + MWIFIEX_DFS_ADD_FILE(debug); + MWIFIEX_DFS_ADD_FILE(getlog); + MWIFIEX_DFS_ADD_FILE(regrdwr); + MWIFIEX_DFS_ADD_FILE(rdeeprom); + MWIFIEX_DFS_ADD_FILE(device_dump); + MWIFIEX_DFS_ADD_FILE(memrw); + MWIFIEX_DFS_ADD_FILE(hscfg); + MWIFIEX_DFS_ADD_FILE(histogram); + MWIFIEX_DFS_ADD_FILE(debug_mask); + MWIFIEX_DFS_ADD_FILE(timeshare_coex); + MWIFIEX_DFS_ADD_FILE(reset); + } + + /* + * This function removes the debug FS directory structure and the files. + */ + void + mwifiex_dev_debugfs_remove(struct mwifiex_private *priv) + { + if (!priv) + return; + + debugfs_remove_recursive(priv->dfs_dev_dir); + } + + /* + * This function creates the top level proc directory. + */ + void + mwifiex_debugfs_init(void) + { + if (!mwifiex_dfs_dir) + mwifiex_dfs_dir = debugfs_create_dir("mwifiex", NULL); + } + + /* + * This function removes the top level proc directory. + */ + void + mwifiex_debugfs_remove(void) + { + if (mwifiex_dfs_dir) + debugfs_remove(mwifiex_dfs_dir); + } diff --combined drivers/net/wireless/ti/wlcore/debugfs.c index be72306,8367f9e..7f672f6 --- a/drivers/net/wireless/ti/wlcore/debugfs.c +++ b/drivers/net/wireless/ti/wlcore/debugfs.c @@@ -1205,11 -1205,26 +1205,11 @@@ err_out
static loff_t dev_mem_seek(struct file *file, loff_t offset, int orig) { - loff_t ret; - /* only requests of dword-aligned size and offset are supported */ if (offset % 4) return -EINVAL;
- switch (orig) { - case SEEK_SET: - file->f_pos = offset; - ret = file->f_pos; - break; - case SEEK_CUR: - file->f_pos += offset; - ret = file->f_pos; - break; - default: - ret = -EINVAL; - } - - return ret; + return no_seek_end_llseek(file, offset, orig); }
static const struct file_operations dev_mem_ops = { @@@ -1219,6 -1234,65 +1219,65 @@@ .llseek = dev_mem_seek, };
+ static ssize_t fw_logger_read(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) + { + struct wl1271 *wl = file->private_data; + + return wl1271_format_buffer(user_buf, count, + ppos, "%d\n", + wl->conf.fwlog.output); + } + + static ssize_t fw_logger_write(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) + { + struct wl1271 *wl = file->private_data; + unsigned long value; + int ret; + + ret = kstrtoul_from_user(user_buf, count, 0, &value); + if (ret < 0) { + wl1271_warning("illegal value in fw_logger"); + return -EINVAL; + } + + if ((value > 2) || (value == 0)) { + wl1271_warning("fw_logger value must be 1-UART 2-SDIO"); + return -ERANGE; + } + + if (wl->conf.fwlog.output == 0) { + wl1271_warning("iligal opperation - fw logger disabled by default, please change mode via wlconf"); + return -EINVAL; + } + + mutex_lock(&wl->mutex); + ret = wl1271_ps_elp_wakeup(wl); + if (ret < 0) { + count = ret; + goto out; + } + + wl->conf.fwlog.output = value; + + ret = wl12xx_cmd_config_fwlog(wl); + + wl1271_ps_elp_sleep(wl); + + out: + mutex_unlock(&wl->mutex); + return count; + } + + static const struct file_operations fw_logger_ops = { + .open = simple_open, + .read = fw_logger_read, + .write = fw_logger_write, + .llseek = default_llseek, + }; + static int wl1271_debugfs_add_files(struct wl1271 *wl, struct dentry *rootdir) { @@@ -1245,6 -1319,7 +1304,7 @@@ DEBUGFS_ADD(irq_timeout, rootdir); DEBUGFS_ADD(fw_stats_raw, rootdir); DEBUGFS_ADD(sleep_auth, rootdir); + DEBUGFS_ADD(fw_logger, rootdir);
streaming = debugfs_create_dir("rx_streaming", rootdir); if (!streaming || IS_ERR(streaming)) diff --combined lib/Kconfig.debug index 749e886,0d76ecc..fba805e --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@@ -216,7 -216,7 +216,7 @@@ config STRIP_ASM_SYM
config READABLE_ASM bool "Generate readable assembler code" - depends on DEBUG_KERNEL + depends on DEBUG_KERNEL && !LTO help Disable some compiler optimizations that tend to generate human unreadable assembler output. This may make the kernel slightly slower, but it helps @@@ -1484,6 -1484,29 +1484,29 @@@ config OF_RECONFIG_NOTIFIER_ERROR_INJEC
If unsure, say N.
+ config NETDEV_NOTIFIER_ERROR_INJECT + tristate "Netdev notifier error injection module" + depends on NET && NOTIFIER_ERROR_INJECTION + help + This option provides the ability to inject artificial errors to + netdevice notifier chain callbacks. It is controlled through debugfs + interface /sys/kernel/debug/notifier-error-inject/netdev + + If the notifier call chain should be failed with some events + notified, write the error code to "actions/<notifier event>/error". + + Example: Inject netdevice mtu change error (-22 = -EINVAL) + + # cd /sys/kernel/debug/notifier-error-inject/netdev + # echo -22 > actions/NETDEV_CHANGEMTU/error + # ip link set eth0 mtu 1024 + RTNETLINK answers: Invalid argument + + To compile this code as a module, choose M here: the module will + be called netdev-notifier-error-inject. + + If unsure, say N. + config FAULT_INJECTION bool "Fault-injection framework" depends on DEBUG_KERNEL diff --combined net/batman-adv/bat_iv_ogm.c index aa94b4e,2467024..df625de --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c @@@ -185,8 -185,7 +185,8 @@@ unlock static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node, int max_if_num, int del_if_num) { - int chunk_size, ret = -ENOMEM, if_offset; + int ret = -ENOMEM; + size_t chunk_size, if_offset; void *data_ptr = NULL;
spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock); @@@ -204,9 -203,8 +204,9 @@@ memcpy(data_ptr, orig_node->bat_iv.bcast_own, del_if_num * chunk_size);
/* copy second part */ + if_offset = (del_if_num + 1) * chunk_size; memcpy((char *)data_ptr + del_if_num * chunk_size, - orig_node->bat_iv.bcast_own + ((del_if_num + 1) * chunk_size), + (uint8_t *)orig_node->bat_iv.bcast_own + if_offset, (max_if_num - del_if_num) * chunk_size);
free_bcast_own: @@@ -363,7 -361,6 +363,6 @@@ batadv_iv_ogm_primary_iface_set(struct unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff; - batadv_ogm_packet->flags = BATADV_PRIMARIES_FIRST_HOP; batadv_ogm_packet->ttl = BATADV_TTL; }
@@@ -844,8 -841,6 +843,6 @@@ static void batadv_iv_ogm_forward(struc "Forwarding packet: tq: %i, ttl: %i\n", batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
- /* switch of primaries first hop flag when forwarding */ - batadv_ogm_packet->flags &= ~BATADV_PRIMARIES_FIRST_HOP; if (is_single_hop_neigh) batadv_ogm_packet->flags |= BATADV_DIRECTLINK; else @@@ -1381,6 -1376,7 +1378,7 @@@ batadv_iv_ogm_process_per_outif(const s struct batadv_hard_iface *if_outgoing) { struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); + struct batadv_hardif_neigh_node *hardif_neigh = NULL; struct batadv_neigh_node *router = NULL; struct batadv_neigh_node *router_router = NULL; struct batadv_orig_node *orig_neigh_node; @@@ -1425,6 -1421,13 +1423,13 @@@ goto out; }
+ if (is_single_hop_neigh) { + hardif_neigh = batadv_hardif_neigh_get(if_incoming, + ethhdr->h_source); + if (hardif_neigh) + hardif_neigh->last_seen = jiffies; + } + router = batadv_orig_router_get(orig_node, if_outgoing); if (router) { router_router = batadv_orig_router_get(router->orig_node, @@@ -1559,6 -1562,8 +1564,8 @@@ out batadv_neigh_node_free_ref(router_router); if (orig_neigh_router) batadv_neigh_node_free_ref(orig_neigh_router); + if (hardif_neigh) + batadv_hardif_neigh_free_ref(hardif_neigh);
kfree_skb(skb_priv); } @@@ -1864,6 -1869,58 +1871,58 @@@ next }
/** + * batadv_iv_hardif_neigh_print - print a single hop neighbour node + * @seq: neighbour table seq_file struct + * @hardif_neigh: hardif neighbour information + */ + static void + batadv_iv_hardif_neigh_print(struct seq_file *seq, + struct batadv_hardif_neigh_node *hardif_neigh) + { + int last_secs, last_msecs; + + last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000; + last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000; + + seq_printf(seq, " %10s %pM %4i.%03is\n", + hardif_neigh->if_incoming->net_dev->name, + hardif_neigh->addr, last_secs, last_msecs); + } + + /** + * batadv_iv_ogm_neigh_print - print the single hop neighbour list + * @bat_priv: the bat priv with all the soft interface information + * @seq: neighbour table seq_file struct + */ + static void batadv_iv_neigh_print(struct batadv_priv *bat_priv, + struct seq_file *seq) + { + struct net_device *net_dev = (struct net_device *)seq->private; + struct batadv_hardif_neigh_node *hardif_neigh; + struct batadv_hard_iface *hard_iface; + int batman_count = 0; + + seq_printf(seq, " %10s %-13s %s\n", + "IF", "Neighbor", "last-seen"); + + rcu_read_lock(); + list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { + if (hard_iface->soft_iface != net_dev) + continue; + + hlist_for_each_entry_rcu(hardif_neigh, + &hard_iface->neigh_list, list) { + batadv_iv_hardif_neigh_print(seq, hardif_neigh); + batman_count++; + } + } + rcu_read_unlock(); + + if (batman_count == 0) + seq_puts(seq, "No batman nodes in range ...\n"); + } + + /** * batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors * @neigh1: the first neighbor object of the comparison * @if_outgoing1: outgoing interface for the first neighbor @@@ -1904,8 -1961,8 +1963,8 @@@ out }
/** - * batadv_iv_ogm_neigh_is_eob - check if neigh1 is equally good or better than - * neigh2 from the metric prospective + * batadv_iv_ogm_neigh_is_sob - check if neigh1 is similarly good or better + * than neigh2 from the metric prospective * @neigh1: the first neighbor object of the comparison * @if_outgoing1: outgoing interface for the first neighbor * @neigh2: the second neighbor object of the comparison @@@ -1915,7 -1972,7 +1974,7 @@@ * the metric via neigh2, false otherwise. */ static bool - batadv_iv_ogm_neigh_is_eob(struct batadv_neigh_node *neigh1, + batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1, struct batadv_hard_iface *if_outgoing1, struct batadv_neigh_node *neigh2, struct batadv_hard_iface *if_outgoing2) @@@ -1955,7 -2012,8 +2014,8 @@@ static struct batadv_algo_ops batadv_ba .bat_ogm_schedule = batadv_iv_ogm_schedule, .bat_ogm_emit = batadv_iv_ogm_emit, .bat_neigh_cmp = batadv_iv_ogm_neigh_cmp, - .bat_neigh_is_equiv_or_better = batadv_iv_ogm_neigh_is_eob, + .bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob, + .bat_neigh_print = batadv_iv_neigh_print, .bat_orig_print = batadv_iv_ogm_orig_print, .bat_orig_free = batadv_iv_ogm_orig_free, .bat_orig_add_if = batadv_iv_ogm_orig_add_if, diff --combined net/ipv4/udp_offload.c index 5d396b9,1300426..4c519c1 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@@ -21,7 -21,6 +21,7 @@@ static struct udp_offload_priv __rcu *u
struct udp_offload_priv { struct udp_offload *offload; + possible_net_t net; struct rcu_head rcu; struct udp_offload_priv __rcu *next; }; @@@ -61,8 -60,9 +61,9 @@@ static struct sk_buff *__skb_udp_tunnel
/* Try to offload checksum if possible */ offload_csum = !!(need_csum && - (skb->dev->features & - (is_ipv6 ? NETIF_F_V6_CSUM : NETIF_F_V4_CSUM))); + ((skb->dev->features & NETIF_F_HW_CSUM) || + (skb->dev->features & (is_ipv6 ? + NETIF_F_IPV6_CSUM : NETIF_F_IP_CSUM))));
/* segment inner packet. */ enc_features = skb->dev->hw_enc_features & features; @@@ -242,14 -242,13 +243,14 @@@ out return segs; }
-int udp_add_offload(struct udp_offload *uo) +int udp_add_offload(struct net *net, struct udp_offload *uo) { struct udp_offload_priv *new_offload = kzalloc(sizeof(*new_offload), GFP_ATOMIC);
if (!new_offload) return -ENOMEM;
+ write_pnet(&new_offload->net, net); new_offload->offload = uo;
spin_lock(&udp_offload_lock); @@@ -313,8 -312,7 +314,8 @@@ struct sk_buff **udp_gro_receive(struc rcu_read_lock(); uo_priv = rcu_dereference(udp_offload_base); for (; uo_priv != NULL; uo_priv = rcu_dereference(uo_priv->next)) { - if (uo_priv->offload->port == uh->dest && + if (net_eq(read_pnet(&uo_priv->net), dev_net(skb->dev)) && + uo_priv->offload->port == uh->dest && uo_priv->offload->callbacks.gro_receive) goto unflush; } @@@ -392,8 -390,7 +393,8 @@@ int udp_gro_complete(struct sk_buff *sk
uo_priv = rcu_dereference(udp_offload_base); for (; uo_priv != NULL; uo_priv = rcu_dereference(uo_priv->next)) { - if (uo_priv->offload->port == uh->dest && + if (net_eq(read_pnet(&uo_priv->net), dev_net(skb->dev)) && + uo_priv->offload->port == uh->dest && uo_priv->offload->callbacks.gro_complete) break; }