Merge branch 'master' of https://github.com/freifunk-gluon/gluon
This commit is contained in:
commit
fb09a27a66
@ -6,8 +6,8 @@ different communities with different expectations and requirements, it is both
|
|||||||
essential and difficult to have contributions from the communities. While they
|
essential and difficult to have contributions from the communities. While they
|
||||||
are sometimes necessary to adapt Gluon to the needs of the communities, they
|
are sometimes necessary to adapt Gluon to the needs of the communities, they
|
||||||
also have to be adaptable enough to fit as many needs as possible. On the other
|
also have to be adaptable enough to fit as many needs as possible. On the other
|
||||||
hands, very special needs are better addressed in packages in [community
|
hands, very special needs are better addressed in [packages] in community
|
||||||
repositories], because the Gluon maintainers would not use or test them and
|
repositories, because the Gluon maintainers would not use or test them and
|
||||||
thus couldn't do their "job" of maintaining them.
|
thus couldn't do their "job" of maintaining them.
|
||||||
|
|
||||||
To ease the work for the maintainers and to reduce the frustration of
|
To ease the work for the maintainers and to reduce the frustration of
|
||||||
@ -25,10 +25,9 @@ after merging the changes, too.
|
|||||||
|
|
||||||
The preferred way to discuss in the IRC channel ([#gluon] on irc.hackint.org)
|
The preferred way to discuss in the IRC channel ([#gluon] on irc.hackint.org)
|
||||||
or on the [mailing list], however, you can also open a new issue on Github to
|
or on the [mailing list], however, you can also open a new issue on Github to
|
||||||
discuss there. We maintain a [list of rejected
|
discuss there. We maintain a [list of rejected features] and we'd like to
|
||||||
features](https://github.com/freifunk-gluon/gluon/issues?q=label%3Arejected)
|
kindly ask you to review it first. In general, looking for duplicates may save
|
||||||
and we'd like to kindly ask you to review it first. In general, looking for
|
you some time.
|
||||||
duplicates may save you some time.
|
|
||||||
|
|
||||||
Develop on top of master
|
Develop on top of master
|
||||||
------------------------
|
------------------------
|
||||||
@ -53,7 +52,7 @@ Most changes are trivial enough to fit in one single commit in order to not
|
|||||||
clutter the history. While developing a new feature, you are free to use
|
clutter the history. While developing a new feature, you are free to use
|
||||||
multiple commits, but if your feature is to be merged, reduce the number of
|
multiple commits, but if your feature is to be merged, reduce the number of
|
||||||
commits to a minimum. Even huge feature introductions like the 802.11s mesh
|
commits to a minimum. Even huge feature introductions like the 802.11s mesh
|
||||||
(commit 2a93c58) fit into a single commit.
|
(commit [2a93c58]) fit into a single commit.
|
||||||
|
|
||||||
If you developed your change in multiple smaller commits, you can easily
|
If you developed your change in multiple smaller commits, you can easily
|
||||||
[squash] those before opening the pull request. While discussing, it is okay to
|
[squash] those before opening the pull request. While discussing, it is okay to
|
||||||
@ -62,7 +61,9 @@ the pull request. This way, your change always consists of only one commit and
|
|||||||
can be merged in the instant everybody is content with the whole thing.
|
can be merged in the instant everybody is content with the whole thing.
|
||||||
|
|
||||||
|
|
||||||
[community repositories]: http://gluon.readthedocs.org/en/latest/user/site.html#packages
|
[packages]: http://gluon.readthedocs.org/en/latest/user/site.html#packages
|
||||||
[#gluon]: irc://irc.hackint.org/gluon
|
[#gluon]: https://webirc.hackint.org/#gluon
|
||||||
[mailing list]: mailto:gluon@luebeck.freifunk.net
|
[mailing list]: mailto:gluon@luebeck.freifunk.net
|
||||||
|
[list of rejected features]: https://github.com/freifunk-gluon/gluon/issues?q=label%3Arejected
|
||||||
|
[2a93c58]: https://github.com/freifunk-gluon/gluon/commit/2a93c580428d10724116b0d2d1238e2745715a14
|
||||||
[squash]: https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits
|
[squash]: https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits
|
||||||
|
18
Makefile
18
Makefile
@ -4,11 +4,16 @@ LC_ALL:=C
|
|||||||
LANG:=C
|
LANG:=C
|
||||||
export LC_ALL LANG
|
export LC_ALL LANG
|
||||||
|
|
||||||
|
export SHELL:=/usr/bin/env bash
|
||||||
|
|
||||||
|
GLUONPATH ?= $(PATH)
|
||||||
|
export GLUONPATH := $(GLUONPATH)
|
||||||
|
|
||||||
empty:=
|
empty:=
|
||||||
space:= $(empty) $(empty)
|
space:= $(empty) $(empty)
|
||||||
|
|
||||||
GLUONMAKE_EARLY = $(SUBMAKE) -C $(GLUON_ORIGOPENWRTDIR) -f $(GLUONDIR)/Makefile GLUON_TOOLS=0 QUILT=
|
GLUONMAKE_EARLY = PATH=$(GLUONPATH) $(SUBMAKE) -C $(GLUON_ORIGOPENWRTDIR) -f $(GLUONDIR)/Makefile GLUON_TOOLS=0 QUILT=
|
||||||
GLUONMAKE = $(SUBMAKE) -C $(GLUON_OPENWRTDIR) -f $(GLUONDIR)/Makefile
|
GLUONMAKE = PATH=$(GLUONPATH) $(SUBMAKE) -C $(GLUON_OPENWRTDIR) -f $(GLUONDIR)/Makefile
|
||||||
|
|
||||||
ifneq ($(OPENWRT_BUILD),1)
|
ifneq ($(OPENWRT_BUILD),1)
|
||||||
|
|
||||||
@ -24,12 +29,6 @@ update: FORCE
|
|||||||
$(GLUONDIR)/scripts/update.sh
|
$(GLUONDIR)/scripts/update.sh
|
||||||
$(GLUONDIR)/scripts/patch.sh
|
$(GLUONDIR)/scripts/patch.sh
|
||||||
|
|
||||||
patch: FORCE
|
|
||||||
$(GLUONDIR)/scripts/patch.sh
|
|
||||||
|
|
||||||
unpatch: FORCE
|
|
||||||
$(GLUONDIR)/scripts/unpatch.sh
|
|
||||||
|
|
||||||
update-patches: FORCE
|
update-patches: FORCE
|
||||||
$(GLUONDIR)/scripts/update.sh
|
$(GLUONDIR)/scripts/update.sh
|
||||||
$(GLUONDIR)/scripts/update-patches.sh
|
$(GLUONDIR)/scripts/update-patches.sh
|
||||||
@ -299,7 +298,8 @@ prepare-target: $(GLUON_OPKG_KEY).pub
|
|||||||
$(target_prepared_stamp):
|
$(target_prepared_stamp):
|
||||||
+$(GLUONMAKE_EARLY) prepare-target
|
+$(GLUONMAKE_EARLY) prepare-target
|
||||||
|
|
||||||
maybe-prepare-target: $(GLUON_OPKG_KEY).pub $(target_prepared_stamp)
|
maybe-prepare-target: $(target_prepared_stamp)
|
||||||
|
+$(GLUONMAKE_EARLY) $(GLUON_OPKG_KEY).pub
|
||||||
|
|
||||||
$(BUILD_DIR)/.prepared: Makefile
|
$(BUILD_DIR)/.prepared: Makefile
|
||||||
@mkdir -p $$(dirname $@)
|
@mkdir -p $$(dirname $@)
|
||||||
|
@ -12,11 +12,14 @@ Before opening an issue, make sure to check whether any existing issues
|
|||||||
(open or closed) match. If you're suggesting a new feature, drop by on IRC or
|
(open or closed) match. If you're suggesting a new feature, drop by on IRC or
|
||||||
our mailinglist to discuss it first.
|
our mailinglist to discuss it first.
|
||||||
|
|
||||||
|
We maintain a [Roadmap](https://github.com/freifunk-gluon/gluon/wiki/Roadmap) for
|
||||||
|
the future development of Gluon.
|
||||||
|
|
||||||
## Use a release!
|
## Use a release!
|
||||||
|
|
||||||
Please refrain from using the `master` branch for anything else but development purposes!
|
Please refrain from using the `master` branch for anything else but development purposes!
|
||||||
Use the most recent release instead. You can list all relaseses by running `git branch -a`
|
Use the most recent release instead. You can list all relaseses by running `git branch -a`
|
||||||
and switch to one by running `git checkout v2016.1.2 && make update`.
|
and switch to one by running `git checkout v2016.1.5 && make update`.
|
||||||
|
|
||||||
If you're using the autoupdater, do not autoupdate nodes with anything but releases.
|
If you're using the autoupdater, do not autoupdate nodes with anything but releases.
|
||||||
If you upgrade using random master commits the nodes *will break* eventually.
|
If you upgrade using random master commits the nodes *will break* eventually.
|
||||||
|
@ -47,7 +47,7 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = 'Gluon'
|
project = 'Gluon'
|
||||||
copyright = '2015, Project Gluon'
|
copyright = '2015-2016, Project Gluon'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
@ -51,7 +51,7 @@ may be defined arbitrarily.
|
|||||||
|
|
||||||
On devices with multiple WLAN adapters, care must also be taken that the primary MAC address is
|
On devices with multiple WLAN adapters, care must also be taken that the primary MAC address is
|
||||||
configured correctly. ``/lib/gluon/core/sysconfig/primary_mac`` should contain the MAC address which
|
configured correctly. ``/lib/gluon/core/sysconfig/primary_mac`` should contain the MAC address which
|
||||||
can be found on a label on most hardware; if it does not, ``/lib/gluon/upgrade/core/initial/001-sysconfig``
|
can be found on a label on most hardware; if it does not, ``/lib/gluon/upgrade/010-primary-mac``
|
||||||
in ``gluon-core`` might need a fix. (There have also been cases in which the address was incorrect
|
in ``gluon-core`` might need a fix. (There have also been cases in which the address was incorrect
|
||||||
even on devices with only one WLAN adapter, in these cases an OpenWrt bug was the cause).
|
even on devices with only one WLAN adapter, in these cases an OpenWrt bug was the cause).
|
||||||
|
|
||||||
|
@ -70,5 +70,11 @@ These commands can be used on a node:
|
|||||||
|
|
||||||
# Force update check, even when the updater is disabled
|
# Force update check, even when the updater is disabled
|
||||||
autoupdater -f
|
autoupdater -f
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
# If fallback is true the updater will perform an update only if
|
||||||
|
# the timespan given by the priority and another 24h have passed
|
||||||
|
autoupdater --fallback
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@ Packages
|
|||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
package/gluon-client-bridge
|
package/gluon-client-bridge
|
||||||
|
package/gluon-config-mode-geo-location
|
||||||
package/gluon-ebtables-filter-multicast
|
package/gluon-ebtables-filter-multicast
|
||||||
package/gluon-ebtables-filter-ra-dhcp
|
package/gluon-ebtables-filter-ra-dhcp
|
||||||
|
|
||||||
@ -60,6 +61,9 @@ Releases
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
releases/v2016.1.5
|
||||||
|
releases/v2016.1.4
|
||||||
|
releases/v2016.1.3
|
||||||
releases/v2016.1.2
|
releases/v2016.1.2
|
||||||
releases/v2016.1.1
|
releases/v2016.1.1
|
||||||
releases/v2016.1
|
releases/v2016.1
|
||||||
@ -77,6 +81,16 @@ Supported Devices & Architectures
|
|||||||
ar71xx-generic
|
ar71xx-generic
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* 8devices
|
||||||
|
|
||||||
|
- Carambola 2
|
||||||
|
|
||||||
|
* ALFA Network
|
||||||
|
|
||||||
|
- AP121
|
||||||
|
- AP121U
|
||||||
|
- Hornet-UB
|
||||||
|
|
||||||
* Allnet
|
* Allnet
|
||||||
|
|
||||||
- ALL0315N
|
- ALL0315N
|
||||||
@ -87,6 +101,11 @@ ar71xx-generic
|
|||||||
- WZR-HP-G300NH
|
- WZR-HP-G300NH
|
||||||
- WZR-HP-G450H
|
- WZR-HP-G450H
|
||||||
|
|
||||||
|
* Cisco Meraki
|
||||||
|
|
||||||
|
- MR12 / MR62
|
||||||
|
- MR16 / MR66
|
||||||
|
|
||||||
* D-Link
|
* D-Link
|
||||||
|
|
||||||
- DIR-505 (A1)
|
- DIR-505 (A1)
|
||||||
@ -112,6 +131,18 @@ ar71xx-generic
|
|||||||
|
|
||||||
- Omega
|
- Omega
|
||||||
|
|
||||||
|
* OpenMesh
|
||||||
|
|
||||||
|
- MR1750
|
||||||
|
- MR600 (v1, v2)
|
||||||
|
- MR900 (v1, v2)
|
||||||
|
- OM2P (v1, v2)
|
||||||
|
- OM2P-HS (v1, v2)
|
||||||
|
- OM2P-LC
|
||||||
|
- OM5P
|
||||||
|
- OM5P-AC (v1, v2)
|
||||||
|
- OM5P-AN
|
||||||
|
|
||||||
* TP-Link
|
* TP-Link
|
||||||
|
|
||||||
- CPE210 (v1.0, v1.1)
|
- CPE210 (v1.0, v1.1)
|
||||||
@ -140,7 +171,7 @@ ar71xx-generic
|
|||||||
- TL-WR741N/ND (v1, v2, v4, v5)
|
- TL-WR741N/ND (v1, v2, v4, v5)
|
||||||
- TL-WR743N/ND (v1, v2)
|
- TL-WR743N/ND (v1, v2)
|
||||||
- TL-WR801N/ND (v1, v2)
|
- TL-WR801N/ND (v1, v2)
|
||||||
- TL-WR841N/ND (v3, v5, v7, v8, v9, v10)
|
- TL-WR841N/ND (v3, v5, v7, v8, v9, v10, v11)
|
||||||
- TL-WR842N/ND (v1, v2)
|
- TL-WR842N/ND (v1, v2)
|
||||||
- TL-WR843N/ND (v1)
|
- TL-WR843N/ND (v1)
|
||||||
- TL-WR940N (v1, v2, v3)
|
- TL-WR940N (v1, v2, v3)
|
||||||
@ -153,11 +184,13 @@ ar71xx-generic
|
|||||||
- Air Gateway
|
- Air Gateway
|
||||||
- Air Router
|
- Air Router
|
||||||
- Bullet M
|
- Bullet M
|
||||||
|
- Loco M
|
||||||
|
- Loco M XW
|
||||||
- Nanostation M
|
- Nanostation M
|
||||||
- Nanostation M XW
|
- Nanostation M XW
|
||||||
- Loco M XW
|
|
||||||
- Picostation M
|
- Picostation M
|
||||||
- Rocket M
|
- Rocket M
|
||||||
|
- Rocket M XW
|
||||||
- UniFi AP
|
- UniFi AP
|
||||||
- UniFi AP Pro
|
- UniFi AP Pro
|
||||||
- UniFi AP Outdoor
|
- UniFi AP Outdoor
|
||||||
|
14
docs/package/gluon-config-mode-geo-location.rst
Normal file
14
docs/package/gluon-config-mode-geo-location.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
gluon-config-mode-geo-location
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This package enables the user to set latitude, longitude and altitude of their
|
||||||
|
node within config mode. As the usage of the altitude is not well defined the
|
||||||
|
corresponding field can be disabled.
|
||||||
|
|
||||||
|
site.conf
|
||||||
|
---------
|
||||||
|
|
||||||
|
config_mode.geo_location.show_altitude : optional
|
||||||
|
- ``true`` enables the altitude field
|
||||||
|
- ``false`` disables the altitude field if altitude has not yet been set
|
||||||
|
- defaults to ``true``
|
43
docs/releases/v2016.1.3.rst
Normal file
43
docs/releases/v2016.1.3.rst
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Gluon 2016.1.3
|
||||||
|
==============
|
||||||
|
|
||||||
|
Added hardware support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
ar71xx-generic
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* ALFA Hornet UB / AP121 / AP121U
|
||||||
|
* TP-Link TL-WA7510N
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
* The nondeterministic boot hang (`#669 <https://github.com/freifunk-gluon/gluon/issues/669>`_) that was thought to
|
||||||
|
be fixed in Gluon v2016.1.2 has resurfaced on other hardware. We believe it is now fixed properly.
|
||||||
|
* Sysupgrades on the Xen DomU have been fixed.
|
||||||
|
* Gluon can now be built on systems that use LibreSSL instead of OpenSSL.
|
||||||
|
|
||||||
|
Known Issues
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Default TX power on many Ubiquiti devices is too high, correct offsets are unknown (`#94 <https://github.com/freifunk-gluon/gluon/issues/94>`_)
|
||||||
|
|
||||||
|
Reducing the TX power in the Expert Mode is recommended.
|
||||||
|
|
||||||
|
* The MAC address of the WAN interface is modified even when Mesh-on-WAN is disabled (`#496 <https://github.com/freifunk-gluon/gluon/issues/496>`_)
|
||||||
|
|
||||||
|
This may lead to issues in environments where a fixed MAC address is expected (like VMware when promicious mode is disallowed).
|
||||||
|
|
||||||
|
* Inconsistent respondd API (`#522 <https://github.com/freifunk-gluon/gluon/issues/522>`_)
|
||||||
|
|
||||||
|
The current API is inconsistent and will be replaced eventually. The old API will still be supported for a while.
|
||||||
|
|
||||||
|
* Unwritable flash on some Ubiquiti PicoStations (`#687 <https://github.com/freifunk-gluon/gluon/issues/687>`_)
|
||||||
|
|
||||||
|
Gluon v2016.1.1 added support for Ubiquiti AirMAX devices with AirOS 5.6.x without downgrading AirOS first before
|
||||||
|
flashing Gluon. It was discovered that on Ubiquiti PicoStations, this downgrade is still necessary, as the
|
||||||
|
flash is not correctly unlocked, leaving the device unable to leave Config Mode and making regular sysupgrades
|
||||||
|
impossible.
|
||||||
|
|
||||||
|
TFTP recovery can be used in this state to flash a new firmware.
|
46
docs/releases/v2016.1.4.rst
Normal file
46
docs/releases/v2016.1.4.rst
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
Gluon 2016.1.4
|
||||||
|
==============
|
||||||
|
|
||||||
|
Added hardware support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
ar71xx-generic
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* 8devices Carambola 2
|
||||||
|
* Meraki MR12/MR62/MR16/MR66
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
* Major update of all WLAN drivers
|
||||||
|
|
||||||
|
We've taken the unusual step of updating the WLAN drivers ("wireless-backports") to a much newer version, as
|
||||||
|
it was reported that the new version fixes unstable WLAN seen in many setups
|
||||||
|
* Build fix: a race condition causing parallel builds to fail has been fixed
|
||||||
|
* Build fix: the Gluon tree could get into a state in which all commands fail with "Too many levels of symbolic links"
|
||||||
|
* Build fix: allow building Gluon on systems with certain versions of *dash* as */bin/sh*
|
||||||
|
|
||||||
|
Known Issues
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Default TX power on many Ubiquiti devices is too high, correct offsets are unknown (`#94 <https://github.com/freifunk-gluon/gluon/issues/94>`_)
|
||||||
|
|
||||||
|
Reducing the TX power in the Expert Mode is recommended.
|
||||||
|
|
||||||
|
* The MAC address of the WAN interface is modified even when Mesh-on-WAN is disabled (`#496 <https://github.com/freifunk-gluon/gluon/issues/496>`_)
|
||||||
|
|
||||||
|
This may lead to issues in environments where a fixed MAC address is expected (like VMware when promicious mode is disallowed).
|
||||||
|
|
||||||
|
* Inconsistent respondd API (`#522 <https://github.com/freifunk-gluon/gluon/issues/522>`_)
|
||||||
|
|
||||||
|
The current API is inconsistent and will be replaced eventually. The old API will still be supported for a while.
|
||||||
|
|
||||||
|
* Unwritable flash on some Ubiquiti PicoStations (`#687 <https://github.com/freifunk-gluon/gluon/issues/687>`_)
|
||||||
|
|
||||||
|
Gluon v2016.1.1 added support for Ubiquiti AirMAX devices with AirOS 5.6.x without downgrading AirOS first before
|
||||||
|
flashing Gluon. It was discovered that on Ubiquiti PicoStations, this downgrade is still necessary, as the
|
||||||
|
flash is not correctly unlocked, leaving the device unable to leave Config Mode and making regular sysupgrades
|
||||||
|
impossible.
|
||||||
|
|
||||||
|
TFTP recovery can be used in this state to flash a new firmware.
|
66
docs/releases/v2016.1.5.rst
Normal file
66
docs/releases/v2016.1.5.rst
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
Gluon 2016.1.5
|
||||||
|
==============
|
||||||
|
|
||||||
|
Added hardware support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
ar71xx-generic
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* OpenMesh
|
||||||
|
|
||||||
|
- MR600 (v1, v2)
|
||||||
|
- MR900 (v1, v2)
|
||||||
|
- OM2P (v1, v2)
|
||||||
|
- OM2P-HS (v1, v2)
|
||||||
|
- OM2P-LC
|
||||||
|
- OM5P
|
||||||
|
- OM5P-AN
|
||||||
|
|
||||||
|
* Ubiquiti
|
||||||
|
|
||||||
|
- Rocket M XW
|
||||||
|
|
||||||
|
* TP-LINK
|
||||||
|
|
||||||
|
- TL-WR841N/ND v11
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
* build: fix race condition caused by using certain make targets (like *clean*, *images* or *package/\**)
|
||||||
|
with parallel build options without doing a full build before
|
||||||
|
* build: fix package dependency issue causing "recursive dependency" warning
|
||||||
|
|
||||||
|
This dependency issue could lead to broken configurations and reportedly caused failed builds in some cases
|
||||||
|
when additional (site-specific) packages were used.
|
||||||
|
* build: Gluon will now build correctly with GCC 6 as host compiler
|
||||||
|
* Fix configuration of batman-adv when VLANs are used on top of IBSS interfaces (regression due to netifd update in :doc:`v2016.1.4`)
|
||||||
|
* Add back missing ath10k firmware (regression due to mac80211 update in :doc:`v2016.1.4`)
|
||||||
|
* Gluon can now be used on all supported Ubiquiti AirMAX devices without downgrading to AirOS 5.5.x before
|
||||||
|
|
||||||
|
:doc:`v2016.1.1` added support for most Ubiquiti AirMAX devices with AirOS 5.6.x without downgrading AirOS,
|
||||||
|
but left some devices (at least some PicoStations and Bullets) with unwritable flash. This issue has been
|
||||||
|
resolved (`#687 <https://github.com/freifunk-gluon/gluon/issues/687>`_).
|
||||||
|
* Add upgrade script to automatically remove whitespace from configured geolocation
|
||||||
|
|
||||||
|
The new respondd implementation included in :doc:`v2016.1` is stricter about the number format than the
|
||||||
|
old one and doesn't accept trailing whitespace (so one or both coordinates are missing from the output).
|
||||||
|
|
||||||
|
The Config Mode has been fixed to strip whitespace from numeric fields in new configurations since :doc:`v2016.1.1`.
|
||||||
|
This still left old configurations, which are now fixed by this script.
|
||||||
|
|
||||||
|
Known Issues
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Default TX power on many Ubiquiti devices is too high, correct offsets are unknown (`#94 <https://github.com/freifunk-gluon/gluon/issues/94>`_)
|
||||||
|
|
||||||
|
Reducing the TX power in the Expert Mode is recommended.
|
||||||
|
|
||||||
|
* The MAC address of the WAN interface is modified even when Mesh-on-WAN is disabled (`#496 <https://github.com/freifunk-gluon/gluon/issues/496>`_)
|
||||||
|
|
||||||
|
This may lead to issues in environments where a fixed MAC address is expected (like VMware when promicious mode is disallowed).
|
||||||
|
|
||||||
|
* Inconsistent respondd API (`#522 <https://github.com/freifunk-gluon/gluon/issues/522>`_)
|
||||||
|
|
||||||
|
The current API is inconsistent and will be replaced eventually. The old API will still be supported for a while.
|
@ -183,4 +183,11 @@
|
|||||||
-- setup_mode = {
|
-- setup_mode = {
|
||||||
-- skip = true,
|
-- skip = true,
|
||||||
-- },
|
-- },
|
||||||
|
|
||||||
|
-- Show/hide the altitude field
|
||||||
|
-- config_mode = {
|
||||||
|
-- geo_location = {
|
||||||
|
-- show_altitude = false,
|
||||||
|
-- },
|
||||||
|
-- },
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,17 @@
|
|||||||
Frequently Asked Questions
|
Frequently Asked Questions
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
.. _faq-dns:
|
||||||
|
|
||||||
|
DNS does not work on the nodes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Gluon nodes will ignore the DNS server on the WAN port for everything except
|
||||||
|
the mesh VPN, which can lead to confusion.
|
||||||
|
|
||||||
|
All normal services on the nodes exclusively use the DNS server on the mesh
|
||||||
|
interface. This DNS server must be announced in router advertisements (using
|
||||||
|
*radvd* or a similar software) from one or more central servers in meshes based
|
||||||
|
on *batman-adv*. If your mesh does not have global IPv6 connectivity, you can setup
|
||||||
|
your *radvd* not to announce a default route by setting the *default lifetime* to 0;
|
||||||
|
in this case, the *radvd* is only used to announce the DNS server.
|
||||||
|
@ -8,7 +8,7 @@ Gluon's releases are managed using `Git tags`_. If you are just getting
|
|||||||
started with Gluon we recommend to use the latest stable release of Gluon.
|
started with Gluon we recommend to use the latest stable release of Gluon.
|
||||||
|
|
||||||
Take a look at the `list of gluon releases`_ and notice the latest release,
|
Take a look at the `list of gluon releases`_ and notice the latest release,
|
||||||
e.g. *v2016.1.2*. Always get Gluon using git and don't try to download it
|
e.g. *v2016.1.5*. Always get Gluon using git and don't try to download it
|
||||||
as a Zip archive as the archive will be missing version information.
|
as a Zip archive as the archive will be missing version information.
|
||||||
|
|
||||||
Please keep in mind that there is no "default Gluon" build; a site configuration
|
Please keep in mind that there is no "default Gluon" build; a site configuration
|
||||||
@ -42,7 +42,7 @@ Building the images
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
To build Gluon, first check out the repository. Replace *RELEASE* with the
|
To build Gluon, first check out the repository. Replace *RELEASE* with the
|
||||||
version you'd like to checkout, e.g. *v2016.1.2*.
|
version you'd like to checkout, e.g. *v2016.1.5*.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ not support IPv6.
|
|||||||
|
|
||||||
This is not true for kernel modules; the Gluon kernel is incompatible with the
|
This is not true for kernel modules; the Gluon kernel is incompatible with the
|
||||||
kernel of the default OpenWrt images. Therefore, Gluon will not only generate images,
|
kernel of the default OpenWrt images. Therefore, Gluon will not only generate images,
|
||||||
but also an opkg repositoy containing all kernel modules provided by OpenWrt/Gluon
|
but also an opkg repository containing all kernel modules provided by OpenWrt/Gluon
|
||||||
for the kernel of the generated images.
|
for the kernel of the generated images.
|
||||||
|
|
||||||
Signing keys
|
Signing keys
|
||||||
|
@ -44,9 +44,12 @@ ntp_server
|
|||||||
List of NTP servers available in your community or used by your community, e.g.:
|
List of NTP servers available in your community or used by your community, e.g.:
|
||||||
::
|
::
|
||||||
|
|
||||||
ntp_servers = {'1.ntp.services.ffeh','2.tnp.services.ffeh'}
|
ntp_servers = {'1.ntp.services.ffeh','2.ntp.services.ffeh'}
|
||||||
|
|
||||||
opkg : optional
|
This NTP servers must be reachable via IPv6 from the nodes. If you don't want to set an IPv6 address
|
||||||
|
explicitly, but use a hostname (which is recommended), see also the :ref:`FAQ <faq-dns>`.
|
||||||
|
|
||||||
|
opkg \: optional
|
||||||
``opkg`` package manager configuration.
|
``opkg`` package manager configuration.
|
||||||
|
|
||||||
There are two optional fields in the ``opkg`` section:
|
There are two optional fields in the ``opkg`` section:
|
||||||
@ -72,7 +75,7 @@ opkg : optional
|
|||||||
- ``%GV`` is replaced by the Gluon version
|
- ``%GV`` is replaced by the Gluon version
|
||||||
- ``%GR`` is replaced by the Gluon release (as specified in ``site.mk``)
|
- ``%GR`` is replaced by the Gluon release (as specified in ``site.mk``)
|
||||||
|
|
||||||
regdom : optional
|
regdom \: optional
|
||||||
The wireless regulatory domain responsible for your area, e.g.:
|
The wireless regulatory domain responsible for your area, e.g.:
|
||||||
::
|
::
|
||||||
|
|
||||||
@ -80,7 +83,7 @@ regdom : optional
|
|||||||
|
|
||||||
Setting ``regdom`` in mandatory if ``wifi24`` or ``wifi5`` is defined.
|
Setting ``regdom`` in mandatory if ``wifi24`` or ``wifi5`` is defined.
|
||||||
|
|
||||||
wifi24 : optional
|
wifi24 \: optional
|
||||||
WLAN configuration for 2.4 GHz devices.
|
WLAN configuration for 2.4 GHz devices.
|
||||||
``channel`` must be set to a valid wireless channel for your radio.
|
``channel`` must be set to a valid wireless channel for your radio.
|
||||||
|
|
||||||
@ -123,10 +126,10 @@ wifi24 : optional
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
wifi5 : optional
|
wifi5 \: optional
|
||||||
Same as `wifi24` but for the 5Ghz radio.
|
Same as `wifi24` but for the 5Ghz radio.
|
||||||
|
|
||||||
next_node : package
|
next_node \: package
|
||||||
Configuration of the local node feature of Gluon
|
Configuration of the local node feature of Gluon
|
||||||
::
|
::
|
||||||
|
|
||||||
@ -136,7 +139,7 @@ next_node : package
|
|||||||
mac = 'ca:ff:ee:ba:be:00'
|
mac = 'ca:ff:ee:ba:be:00'
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh : optional
|
mesh \: optional
|
||||||
Options specific to routing protocols.
|
Options specific to routing protocols.
|
||||||
|
|
||||||
At the moment, only the ``batman_adv`` routing protocol has such options:
|
At the moment, only the ``batman_adv`` routing protocol has such options:
|
||||||
@ -220,13 +223,13 @@ fastd_mesh_vpn
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh_on_wan : optional
|
mesh_on_wan \: optional
|
||||||
Enables the mesh on the WAN port (``true`` or ``false``).
|
Enables the mesh on the WAN port (``true`` or ``false``).
|
||||||
|
|
||||||
mesh_on_lan : optional
|
mesh_on_lan \: optional
|
||||||
Enables the mesh on the LAN port (``true`` or ``false``).
|
Enables the mesh on the LAN port (``true`` or ``false``).
|
||||||
|
|
||||||
autoupdater : package
|
autoupdater \: package
|
||||||
Configuration for the autoupdater feature of Gluon.
|
Configuration for the autoupdater feature of Gluon.
|
||||||
::
|
::
|
||||||
|
|
||||||
@ -249,7 +252,10 @@ autoupdater : package
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
roles : optional
|
All configured mirrors must be reachable from the nodes via IPv6. If you don't want to set an IPv6 address
|
||||||
|
explicitly, but use a hostname (which is recommended), see also the :ref:`FAQ <faq-dns>`.
|
||||||
|
|
||||||
|
roles \: optional
|
||||||
Optional role definitions. Nodes will announce their role inside the mesh.
|
Optional role definitions. Nodes will announce their role inside the mesh.
|
||||||
This will allow in the backend to distinguish between normal, backbone and
|
This will allow in the backend to distinguish between normal, backbone and
|
||||||
service nodes or even gateways (if they advertise that role). It is up to
|
service nodes or even gateways (if they advertise that role). It is up to
|
||||||
@ -273,7 +279,7 @@ roles : optional
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
setup_mode : package
|
setup_mode \: package
|
||||||
Allows skipping setup mode (config mode) at first boot when attribute
|
Allows skipping setup mode (config mode) at first boot when attribute
|
||||||
``skip`` is set to ``true``. This is optional and may be left out.
|
``skip`` is set to ``true``. This is optional and may be left out.
|
||||||
::
|
::
|
||||||
@ -282,7 +288,7 @@ setup_mode : package
|
|||||||
skip = true,
|
skip = true,
|
||||||
},
|
},
|
||||||
|
|
||||||
legacy : package
|
legacy \: package
|
||||||
Configuration for the legacy upgrade path.
|
Configuration for the legacy upgrade path.
|
||||||
This is only required in communities upgrading from Lübeck's LFF-0.3.x.
|
This is only required in communities upgrading from Lübeck's LFF-0.3.x.
|
||||||
::
|
::
|
||||||
@ -393,15 +399,16 @@ This is a non-exhaustive list of site-repos from various communities:
|
|||||||
* `site-ffda <https://github.com/freifunk-darmstadt/site-ffda>`_ (Darmstadt)
|
* `site-ffda <https://github.com/freifunk-darmstadt/site-ffda>`_ (Darmstadt)
|
||||||
* `site-ffgoe <https://github.com/freifunk-goettingen/site-ffgoe>`_ (Göttingen)
|
* `site-ffgoe <https://github.com/freifunk-goettingen/site-ffgoe>`_ (Göttingen)
|
||||||
* `site-ffhh <https://github.com/freifunkhamburg/site-ffhh>`_ (Hamburg)
|
* `site-ffhh <https://github.com/freifunkhamburg/site-ffhh>`_ (Hamburg)
|
||||||
|
* `site-ffho <https://git.c3pb.de/freifunk-pb/site-ffho>`_ (Hochstift)
|
||||||
* `site-ffhgw <https://github.com/lorenzo-greifswald/site-ffhgw>`_ (Greifswald)
|
* `site-ffhgw <https://github.com/lorenzo-greifswald/site-ffhgw>`_ (Greifswald)
|
||||||
|
* `site-ffl <https://github.com/freifunk-leipzig/freifunk-gluon-leipzig>`_ (Leipzig)
|
||||||
* `site-ffhl <https://github.com/freifunk-luebeck/site-ffhl>`_ (Lübeck)
|
* `site-ffhl <https://github.com/freifunk-luebeck/site-ffhl>`_ (Lübeck)
|
||||||
* `site-ffmd <https://github.com/FreifunkMD/site-ffmd>`_ (Magdeburg)
|
* `site-ffmd <https://github.com/FreifunkMD/site-ffmd>`_ (Magdeburg)
|
||||||
* `site-ffmwu <https://github.com/freifunk-mwu/site-ffmwu>`_ (Mainz, Wiesbaden & Umgebung)
|
* `site-ffmwu <https://github.com/freifunk-mwu/site-ffmwu>`_ (Mainz, Wiesbaden & Umgebung)
|
||||||
* `site-ffmyk <https://github.com/FreifunkMYK/site-ffmyk>`_ (Mayen-Koblenz)
|
* `site-ffmyk <https://github.com/FreifunkMYK/site-ffmyk>`_ (Mayen-Koblenz)
|
||||||
* `site-ffm <https://github.com/freifunkMUC/site-ffm>`_ (München)
|
* `site-ffm <https://github.com/freifunkMUC/site-ffm>`_ (München)
|
||||||
* `site-ffms <https://github.com/FreiFunkMuenster/site-ffms>`_ (Münsterland)
|
* `site-ffms <https://github.com/FreiFunkMuenster/site-ffms>`_ (Münsterland)
|
||||||
* `site-ffnw <https://git.nordwest.freifunk.net/ffnw/siteconf/tree/master>`_ (Nordwest)
|
* `site-ffnw <https://git.nordwest.freifunk.net/ffnw-firmware/siteconf/tree/master>`_ (Nordwest)
|
||||||
* `site-ffpb <https://git.c3pb.de/freifunk-pb/site-ffpb>`_ (Paderborn)
|
|
||||||
* `site-ffka <https://github.com/ffka/site-ffka>`_ (Karlsruhe)
|
* `site-ffka <https://github.com/ffka/site-ffka>`_ (Karlsruhe)
|
||||||
* `site-ffrl <https://github.com/ffrl/sites-ffrl>`_ (Rheinland)
|
* `site-ffrl <https://github.com/ffrl/sites-ffrl>`_ (Rheinland)
|
||||||
* `site-ffrg <https://github.com/ffruhr/site-ffruhr>`_ (Ruhrgebiet)
|
* `site-ffrg <https://github.com/ffruhr/site-ffruhr>`_ (Ruhrgebiet)
|
||||||
|
4
modules
4
modules
@ -1,14 +1,14 @@
|
|||||||
GLUON_FEEDS='openwrt gluon routing luci'
|
GLUON_FEEDS='openwrt gluon routing luci'
|
||||||
|
|
||||||
OPENWRT_REPO=git://git.openwrt.org/15.05/openwrt.git
|
OPENWRT_REPO=git://git.openwrt.org/15.05/openwrt.git
|
||||||
OPENWRT_COMMIT=efc26cc8e0513b3ec703ba540a554fde2c717cf6
|
OPENWRT_COMMIT=eadf19c0b43d2f75f196ea8d875a08c7c348530c
|
||||||
|
|
||||||
PACKAGES_OPENWRT_REPO=git://github.com/openwrt/packages.git
|
PACKAGES_OPENWRT_REPO=git://github.com/openwrt/packages.git
|
||||||
PACKAGES_OPENWRT_COMMIT=9622fe984bba3a4547f48bc507ebaba7637eb2b0
|
PACKAGES_OPENWRT_COMMIT=9622fe984bba3a4547f48bc507ebaba7637eb2b0
|
||||||
PACKAGES_OPENWRT_BRANCH=for-15.05
|
PACKAGES_OPENWRT_BRANCH=for-15.05
|
||||||
|
|
||||||
PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git
|
PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git
|
||||||
PACKAGES_GLUON_COMMIT=fea8f67d5d5cccac39b5020a69106f8665d41e58
|
PACKAGES_GLUON_COMMIT=63376e23c81e53c21d3c5250c3fb7444a90dc019
|
||||||
|
|
||||||
PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git
|
PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git
|
||||||
PACKAGES_ROUTING_COMMIT=2a8338559de5c4b077cde7a83f43f4700a17d5cc
|
PACKAGES_ROUTING_COMMIT=2a8338559de5c4b077cde7a83f43f4700a17d5cc
|
||||||
|
@ -16,4 +16,3 @@ c:section('alfred', 'alfred', 'alfred',
|
|||||||
)
|
)
|
||||||
|
|
||||||
c:save('alfred')
|
c:save('alfred')
|
||||||
c:commit('alfred')
|
|
||||||
|
@ -40,7 +40,6 @@ end
|
|||||||
c:set('autoupdater', 'settings', 'version_file', '/lib/gluon/release')
|
c:set('autoupdater', 'settings', 'version_file', '/lib/gluon/release')
|
||||||
|
|
||||||
c:save('autoupdater')
|
c:save('autoupdater')
|
||||||
c:commit('autoupdater')
|
|
||||||
|
|
||||||
|
|
||||||
local autoupdater_util = require 'autoupdater.util'
|
local autoupdater_util = require 'autoupdater.util'
|
||||||
|
@ -24,4 +24,3 @@ end
|
|||||||
uci:set('network', 'client', 'macaddr', sysconfig.primary_mac)
|
uci:set('network', 'client', 'macaddr', sysconfig.primary_mac)
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
@ -21,14 +21,16 @@ local function configure_client(config, radio, index, suffix)
|
|||||||
|
|
||||||
uci:delete('wireless', name)
|
uci:delete('wireless', name)
|
||||||
|
|
||||||
if config then
|
macaddr = util.generate_mac(3*(index-1))
|
||||||
|
|
||||||
|
if config and macaddr then
|
||||||
uci:section('wireless', 'wifi-iface', name,
|
uci:section('wireless', 'wifi-iface', name,
|
||||||
{
|
{
|
||||||
device = radio,
|
device = radio,
|
||||||
network = 'client',
|
network = 'client',
|
||||||
mode = 'ap',
|
mode = 'ap',
|
||||||
ssid = config.ssid,
|
ssid = config.ssid,
|
||||||
macaddr = util.generate_mac(2, index),
|
macaddr = macaddr,
|
||||||
ifname = suffix and 'client' .. suffix,
|
ifname = suffix and 'client' .. suffix,
|
||||||
disabled = disabled,
|
disabled = disabled,
|
||||||
}
|
}
|
||||||
@ -45,4 +47,3 @@ end
|
|||||||
util.iterate_radios(configure_radio)
|
util.iterate_radios(configure_radio)
|
||||||
|
|
||||||
uci:save('wireless')
|
uci:save('wireless')
|
||||||
uci:commit('wireless')
|
|
||||||
|
@ -48,43 +48,42 @@ function action_reboot()
|
|||||||
uci:save("gluon-setup-mode")
|
uci:save("gluon-setup-mode")
|
||||||
uci:commit("gluon-setup-mode")
|
uci:commit("gluon-setup-mode")
|
||||||
|
|
||||||
if nixio.fork() ~= 0 then
|
local fs = require "nixio.fs"
|
||||||
local fs = require "nixio.fs"
|
local util = require "nixio.util"
|
||||||
local util = require "nixio.util"
|
|
||||||
|
|
||||||
local parts_dir = "/lib/gluon/config-mode/reboot/"
|
local parts_dir = "/lib/gluon/config-mode/reboot/"
|
||||||
local files = util.consume(fs.dir(parts_dir))
|
local files = util.consume(fs.dir(parts_dir))
|
||||||
|
|
||||||
table.sort(files)
|
table.sort(files)
|
||||||
|
|
||||||
local parts = {}
|
local parts = {}
|
||||||
|
|
||||||
for _, entry in ipairs(files) do
|
for _, entry in ipairs(files) do
|
||||||
if entry:sub(1, 1) ~= '.' then
|
if entry:sub(1, 1) ~= '.' then
|
||||||
local f = dofile(parts_dir .. '/' .. entry)
|
local f = dofile(parts_dir .. '/' .. entry)
|
||||||
if f ~= nil then
|
if f ~= nil then
|
||||||
table.insert(parts, f)
|
table.insert(parts, f)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local hostname = uci:get_first("system", "system", "hostname")
|
local hostname = uci:get_first("system", "system", "hostname")
|
||||||
|
|
||||||
luci.template.render("gluon/config-mode/reboot", { parts=parts
|
luci.template.render("gluon/config-mode/reboot",
|
||||||
, hostname=hostname
|
{
|
||||||
})
|
parts = parts,
|
||||||
else
|
hostname = hostname,
|
||||||
debug.setfenv(io.stdout, debug.getfenv(io.open '/dev/null'))
|
}
|
||||||
io.stdout:close()
|
)
|
||||||
|
|
||||||
|
if nixio.fork() == 0 then
|
||||||
|
-- Replace stdout with /dev/null
|
||||||
|
nixio.dup(nixio.open('/dev/null', 'w'), nixio.stdout)
|
||||||
|
|
||||||
-- Sleep a little so the browser can fetch everything required to
|
-- Sleep a little so the browser can fetch everything required to
|
||||||
-- display the reboot page, then reboot the device.
|
-- display the reboot page, then reboot the device.
|
||||||
nixio.nanosleep(2)
|
nixio.nanosleep(1)
|
||||||
|
|
||||||
-- Run reboot with popen so it gets its own std filehandles.
|
nixio.execp("reboot")
|
||||||
io.popen("reboot")
|
|
||||||
|
|
||||||
-- Prevent any further execution in this child.
|
|
||||||
os.exit()
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -33,4 +33,9 @@ define Package/gluon-config-mode-geo-location/install
|
|||||||
$(call GluonInstallI18N,gluon-config-mode-geo-location,$(1))
|
$(call GluonInstallI18N,gluon-config-mode-geo-location,$(1))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define Package/gluon-config-mode-geo-location/postinst
|
||||||
|
#!/bin/sh
|
||||||
|
$(call GluonCheckSite,check_site.lua)
|
||||||
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,gluon-config-mode-geo-location))
|
$(eval $(call BuildPackage,gluon-config-mode-geo-location))
|
||||||
|
3
package/gluon-config-mode-geo-location/check_site.lua
Normal file
3
package/gluon-config-mode-geo-location/check_site.lua
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
if need_table('config_mode', nil, false) and need_table('config_mode.geo_location', nil, false) then
|
||||||
|
need_boolean('config_mode.geo_location.show_altitude', false)
|
||||||
|
end
|
@ -1,14 +1,28 @@
|
|||||||
local cbi = require "luci.cbi"
|
local cbi = require "luci.cbi"
|
||||||
local i18n = require "luci.i18n"
|
local i18n = require "luci.i18n"
|
||||||
local uci = luci.model.uci.cursor()
|
local uci = luci.model.uci.cursor()
|
||||||
|
local site = require 'gluon.site_config'
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
|
local function show_altitude()
|
||||||
|
if ((site.config_mode or {}).geo_location or {}).show_altitude ~= false then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if uci:get_first("gluon-node-info", "location", "altitude") then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
function M.section(form)
|
function M.section(form)
|
||||||
local s = form:section(cbi.SimpleSection, nil, i18n.translate(
|
local text = i18n.translate('If you want the location of your node to '
|
||||||
'If you want the location of your node to be displayed on the map, '
|
.. 'be displayed on the map, you can enter its coordinates here.')
|
||||||
.. 'you can enter its coordinates here. Specifying the altitude '
|
if show_altitude() then
|
||||||
.. 'is optional and should only be done if a proper value is known.'))
|
text = text .. ' ' .. i18n.translate('Specifying the altitude is '
|
||||||
|
.. 'optional and should only be done if a proper value is known.')
|
||||||
|
end
|
||||||
|
local s = form:section(cbi.SimpleSection, nil, text)
|
||||||
|
|
||||||
|
|
||||||
local o
|
local o
|
||||||
@ -31,12 +45,14 @@ function M.section(form)
|
|||||||
o.datatype = "float"
|
o.datatype = "float"
|
||||||
o.description = i18n.translatef("e.g. %s", "10.689901")
|
o.description = i18n.translatef("e.g. %s", "10.689901")
|
||||||
|
|
||||||
o = s:option(cbi.Value, "_altitude", i18n.translate("Altitude"))
|
if show_altitude() then
|
||||||
o.default = uci:get_first("gluon-node-info", "location", "altitude")
|
o = s:option(cbi.Value, "_altitude", i18n.translate("Altitude"))
|
||||||
o:depends("_location", "1")
|
o.default = uci:get_first("gluon-node-info", "location", "altitude")
|
||||||
o.rmempty = true
|
o:depends("_location", "1")
|
||||||
o.datatype = "float"
|
o.rmempty = true
|
||||||
o.description = i18n.translatef("e.g. %s", "11.51")
|
o.datatype = "float"
|
||||||
|
o.description = i18n.translatef("e.g. %s", "11.51")
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -12,13 +12,17 @@ msgstr ""
|
|||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want the location of your node to be displayed on the map, you can "
|
"If you want the location of your node to be displayed on the map, you can "
|
||||||
"enter its coordinates here. Specifying the altitude is optional and should "
|
"enter its coordinates here."
|
||||||
"only be done if a proper value is known."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Um deinen Knoten auf der Karte anzeigen zu können, benötigen wir seine "
|
"Um deinen Knoten auf der Karte anzeigen zu können, benötigen wir seine "
|
||||||
"Koordinaten. Hier hast du die Möglichkeit, diese zu hinterlegen. Die "
|
"Koordinaten. Hier hast du die Möglichkeit, diese zu hinterlegen."
|
||||||
"Höhenangabe ist optional und sollte nur gesetzt werden, wenn ein exakter "
|
|
||||||
"Wert bekannt ist."
|
msgid ""
|
||||||
|
"Specifying the altitude is optional and should only be done if a proper "
|
||||||
|
"value is known."
|
||||||
|
msgstr ""
|
||||||
|
"Die Höhenangabe ist optional und sollte nur gesetzt werden, wenn ein "
|
||||||
|
"exakter Wert bekannt ist."
|
||||||
|
|
||||||
msgid "Latitude"
|
msgid "Latitude"
|
||||||
msgstr "Breitengrad"
|
msgstr "Breitengrad"
|
||||||
|
@ -12,12 +12,17 @@ msgstr ""
|
|||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want the location of your node to be displayed on the map, you can "
|
"If you want the location of your node to be displayed on the map, you can "
|
||||||
"enter its coordinates here. Specifying the altitude is optional and should "
|
"enter its coordinates here."
|
||||||
"only be done if a proper value is known."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Pour Afficher votre nœud sur la Carte nous avons besoin de ses coordonnées. "
|
"Pour Afficher votre nœud sur la Carte nous avons besoin de ses coordonnées. "
|
||||||
"Ici vous pouvez entrer sa position. La altitude est optionelle "
|
"Ici vous pouvez entrer sa position."
|
||||||
"et ne devrait que être ajoutée si la valeur exacte est connue. "
|
|
||||||
|
msgid ""
|
||||||
|
"Specifying the altitude is optional and should only be done if a proper "
|
||||||
|
"value is known."
|
||||||
|
msgstr ""
|
||||||
|
"La altitude est optionelle et ne devrait que être ajoutée si la valeur "
|
||||||
|
"exacte est connue."
|
||||||
|
|
||||||
msgid "Latitude"
|
msgid "Latitude"
|
||||||
msgstr "Latitude"
|
msgstr "Latitude"
|
||||||
|
@ -3,8 +3,12 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
|
|||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want the location of your node to be displayed on the map, you can "
|
"If you want the location of your node to be displayed on the map, you can "
|
||||||
"enter its coordinates here. Specifying the altitude is optional and should "
|
"enter its coordinates here."
|
||||||
"only be done if a proper value is known."
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Specifying the altitude is optional and should only be done if a proper "
|
||||||
|
"value is known."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Latitude"
|
msgid "Latitude"
|
||||||
|
@ -11,6 +11,7 @@ else
|
|||||||
|
|
||||||
local pubkey = util.trim(util.exec("/etc/init.d/fastd show_key " .. "mesh_vpn"))
|
local pubkey = util.trim(util.exec("/etc/init.d/fastd show_key " .. "mesh_vpn"))
|
||||||
local hostname = uci:get_first("system", "system", "hostname")
|
local hostname = uci:get_first("system", "system", "hostname")
|
||||||
|
local contact = uci:get_first("gluon-node-info", "owner", "contact")
|
||||||
|
|
||||||
local msg = i18n.translate('gluon-config-mode:pubkey')
|
local msg = i18n.translate('gluon-config-mode:pubkey')
|
||||||
|
|
||||||
@ -19,6 +20,7 @@ else
|
|||||||
, hostname=hostname
|
, hostname=hostname
|
||||||
, site=site
|
, site=site
|
||||||
, sysconfig=sysconfig
|
, sysconfig=sysconfig
|
||||||
|
, contact=contact
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -56,7 +56,7 @@ function M.handle(data)
|
|||||||
uci:set("simple-tc", "mesh_vpn", "limit_egress", data._limit_egress:trim())
|
uci:set("simple-tc", "mesh_vpn", "limit_egress", data._limit_egress:trim())
|
||||||
end
|
end
|
||||||
|
|
||||||
uci:commit("simple-tc")
|
uci:save("simple-tc")
|
||||||
uci:commit("simple-tc")
|
uci:commit("simple-tc")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -12,7 +12,7 @@ define Package/gluon-core
|
|||||||
SECTION:=gluon
|
SECTION:=gluon
|
||||||
CATEGORY:=Gluon
|
CATEGORY:=Gluon
|
||||||
TITLE:=Base files of Gluon
|
TITLE:=Base files of Gluon
|
||||||
DEPENDS:=+gluon-site +libgluonutil +lua-platform-info +luci-base +luci-lib-jsonc +odhcp6c +firewall
|
DEPENDS:=+gluon-site +libgluonutil +lua-platform-info +lua-hash +luci-base +luci-lib-jsonc +odhcp6c +firewall
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,7 +24,15 @@ end
|
|||||||
|
|
||||||
if platform.match('ar71xx', 'generic', {'tl-wdr3600', 'tl-wdr4300'}) then
|
if platform.match('ar71xx', 'generic', {'tl-wdr3600', 'tl-wdr4300'}) then
|
||||||
table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress')
|
table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress')
|
||||||
elseif platform.match('ar71xx', 'generic', {'unifi-outdoor-plus'}) then
|
elseif platform.match('ar71xx', 'generic', {'unifi-outdoor-plus', 'carambola2',
|
||||||
|
'mr600', 'mr600v2',
|
||||||
|
'mr900', 'mr900v2',
|
||||||
|
'mr1750',
|
||||||
|
'om2p', 'om2pv2',
|
||||||
|
'om2p-hs', 'om2p-hsv2',
|
||||||
|
'om2p-lc',
|
||||||
|
'om5p', 'om5p-an',
|
||||||
|
'om5p-ac', 'om5p-acv2'}) then
|
||||||
table.insert(try_files, 1, '/sys/class/net/eth0/address')
|
table.insert(try_files, 1, '/sys/class/net/eth0/address')
|
||||||
elseif platform.match('ar71xx', 'generic', {'archer-c5', 'archer-c7'}) then
|
elseif platform.match('ar71xx', 'generic', {'archer-c5', 'archer-c7'}) then
|
||||||
table.insert(try_files, 1, '/sys/class/net/eth1/address')
|
table.insert(try_files, 1, '/sys/class/net/eth1/address')
|
||||||
|
@ -16,7 +16,7 @@ if not (sysconfig.lan_ifname or sysconfig.wan_ifname) then
|
|||||||
local lan_ifname = uci:get('network', 'lan', 'ifname')
|
local lan_ifname = uci:get('network', 'lan', 'ifname')
|
||||||
local wan_ifname = uci:get('network', 'wan', 'ifname')
|
local wan_ifname = uci:get('network', 'wan', 'ifname')
|
||||||
|
|
||||||
if platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus'}) then
|
if platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then
|
||||||
lan_ifname, wan_ifname = wan_ifname, lan_ifname
|
lan_ifname, wan_ifname = wan_ifname, lan_ifname
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -32,5 +32,4 @@ if not (sysconfig.lan_ifname or sysconfig.wan_ifname) then
|
|||||||
uci:delete('network', 'wan')
|
uci:delete('network', 'wan')
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
end
|
end
|
||||||
|
@ -14,5 +14,4 @@ if not sysconfig.gluon_version then
|
|||||||
uci:set('system', system, 'timezone', site.timezone)
|
uci:set('system', system, 'timezone', site.timezone)
|
||||||
|
|
||||||
uci:save('system')
|
uci:save('system')
|
||||||
uci:commit('system')
|
|
||||||
end
|
end
|
||||||
|
@ -53,7 +53,31 @@ uci:section('network', 'route6', 'wan6_unreachable',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
|
||||||
|
uci:section('firewall', 'rule', 'wan_igmp',
|
||||||
|
{
|
||||||
|
name = 'Allow-IGMP',
|
||||||
|
src = 'wan',
|
||||||
|
proto = 'igmp',
|
||||||
|
family = 'ipv4',
|
||||||
|
target = 'ACCEPT',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
uci:section('firewall', 'rule', 'wan_mld',
|
||||||
|
{
|
||||||
|
name = 'Allow-MLD',
|
||||||
|
src = 'wan',
|
||||||
|
proto = 'icmp',
|
||||||
|
src_ip = 'fe80::/10',
|
||||||
|
icmp_type = { '130/0', '131/0', '132/0', '143/0', },
|
||||||
|
family = 'ipv6',
|
||||||
|
target = 'ACCEPT',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
uci:save('firewall')
|
||||||
|
|
||||||
|
|
||||||
sysctl.set('net.ipv6.conf.all.accept_ra', 0)
|
sysctl.set('net.ipv6.conf.all.accept_ra', 0)
|
||||||
|
@ -11,4 +11,3 @@ local c = uci.cursor()
|
|||||||
c:delete('system', 'ntp', 'server')
|
c:delete('system', 'ntp', 'server')
|
||||||
c:set_list('system', 'ntp', 'server', site.ntp_servers)
|
c:set_list('system', 'ntp', 'server', site.ntp_servers)
|
||||||
c:save('system')
|
c:save('system')
|
||||||
c:commit('system')
|
|
||||||
|
@ -27,4 +27,3 @@ c:section('firewall', 'rule', 'wan_ssh',
|
|||||||
)
|
)
|
||||||
|
|
||||||
c:save('firewall')
|
c:save('firewall')
|
||||||
c:commit('firewall')
|
|
||||||
|
@ -33,4 +33,3 @@ end
|
|||||||
util.iterate_radios(configure_radio)
|
util.iterate_radios(configure_radio)
|
||||||
|
|
||||||
uci:save('wireless')
|
uci:save('wireless')
|
||||||
uci:commit('wireless')
|
|
||||||
|
3
package/gluon-core/files/lib/gluon/upgrade/998-commit
Executable file
3
package/gluon-core/files/lib/gluon/upgrade/998-commit
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
exec uci commit
|
@ -7,7 +7,7 @@ local function get_site_config()
|
|||||||
local file = assert(io.open(config))
|
local file = assert(io.open(config))
|
||||||
|
|
||||||
local decoder = json.new()
|
local decoder = json.new()
|
||||||
ltn12.pump.all(ltn12.source.file(io.open(config)), decoder:sink())
|
ltn12.pump.all(ltn12.source.file(file), decoder:sink())
|
||||||
|
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ local ipairs = ipairs
|
|||||||
local table = table
|
local table = table
|
||||||
|
|
||||||
local nixio = require 'nixio'
|
local nixio = require 'nixio'
|
||||||
|
local hash = require 'hash'
|
||||||
local sysconfig = require 'gluon.sysconfig'
|
local sysconfig = require 'gluon.sysconfig'
|
||||||
local site = require 'gluon.site_config'
|
local site = require 'gluon.site_config'
|
||||||
local uci = require('luci.model.uci').cursor()
|
local uci = require('luci.model.uci').cursor()
|
||||||
@ -71,22 +72,37 @@ function node_id()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Generates a (hopefully) unique MAC address
|
-- Generates a (hopefully) unique MAC address
|
||||||
-- The first parameter defines the function and the second
|
-- The parameter defines the ID to add to the mac addr
|
||||||
-- parameter an ID to add to the MAC address
|
--
|
||||||
-- Functions and IDs defined so far:
|
-- IDs defined so far:
|
||||||
-- (1, 0): WAN (for mesh-on-WAN)
|
-- 0: client0; mesh-vpn
|
||||||
-- (1, 1): LAN (for mesh-on-LAN)
|
-- 1: mesh0
|
||||||
-- (2, n): client interface for the n'th radio
|
-- 2: ibss0
|
||||||
-- (3, n): adhoc interface for n'th radio
|
-- 3: client1; mesh-on-wan
|
||||||
-- (4, 0): mesh VPN
|
-- 4: mesh1
|
||||||
-- (5, n): mesh interface for n'th radio (802.11s)
|
-- 5: ibss1
|
||||||
function generate_mac(f, i)
|
-- 6: mesh-on-lan
|
||||||
local m1, m2, m3, m4, m5, m6 = string.match(sysconfig.primary_mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
|
-- 7: unused
|
||||||
m1 = nixio.bit.bor(tonumber(m1, 16), 0x02)
|
function generate_mac(i)
|
||||||
m2 = (tonumber(m2, 16)+f) % 0x100
|
if i > 7 or i < 0 then return nil end -- max allowed id (0b111)
|
||||||
m3 = (tonumber(m3, 16)+i) % 0x100
|
|
||||||
|
|
||||||
return string.format('%02x:%02x:%02x:%s:%s:%s', m1, m2, m3, m4, m5, m6)
|
local hashed = string.sub(hash.md5(sysconfig.primary_mac), 0, 12)
|
||||||
|
local m1, m2, m3, m4, m5, m6 = string.match(hashed, '(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)')
|
||||||
|
|
||||||
|
m1 = tonumber(m1, 16)
|
||||||
|
m6 = tonumber(m6, 16)
|
||||||
|
|
||||||
|
m1 = nixio.bit.bor(m1, 0x02) -- set locally administered bit
|
||||||
|
m1 = nixio.bit.band(m1, 0xFE) -- unset the multicast bit
|
||||||
|
|
||||||
|
-- It's necessary that the first 45 bits of the mac do
|
||||||
|
-- not vary on a single hardware interface, since some chips are using
|
||||||
|
-- a hardware mac filter. (e.g 'ramips-rt305x')
|
||||||
|
|
||||||
|
m6 = nixio.bit.band(m6, 0xF8) -- zero the last three bits (space needed for counting)
|
||||||
|
m6 = m6 + i -- add virtual interface id
|
||||||
|
|
||||||
|
return string.format('%02x:%s:%s:%s:%s:%02x', m1, m2, m3, m4, m5, m6)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Iterate over all radios defined in UCI calling
|
-- Iterate over all radios defined in UCI calling
|
||||||
|
@ -34,7 +34,6 @@ if sysconfig.gluon_version == 'legacy' then
|
|||||||
uci:delete('network', 'wan')
|
uci:delete('network', 'wan')
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,5 +20,4 @@ if sysconfig.gluon_version == 'legacy' then
|
|||||||
uci:delete_all('wireless', 'wifi-iface', delete_legacy_iface)
|
uci:delete_all('wireless', 'wifi-iface', delete_legacy_iface)
|
||||||
|
|
||||||
uci:save('wireless')
|
uci:save('wireless')
|
||||||
uci:commit('wireless')
|
|
||||||
end
|
end
|
||||||
|
@ -12,9 +12,7 @@ if sysconfig.gluon_version == 'legacy' then
|
|||||||
if old == '1' then
|
if old == '1' then
|
||||||
local setup_mode = uci:get_first('gluon-setup-mode', 'setup_mode')
|
local setup_mode = uci:get_first('gluon-setup-mode', 'setup_mode')
|
||||||
uci:set('gluon-setup-mode', setup_mode, 'configured', '1')
|
uci:set('gluon-setup-mode', setup_mode, 'configured', '1')
|
||||||
|
|
||||||
uci:save('gluon-setup-mode')
|
uci:save('gluon-setup-mode')
|
||||||
uci:commit('gluon-setup-mode')
|
|
||||||
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
@ -21,7 +21,6 @@ if sysconfig.gluon_version == 'legacy' then
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('simple-tc')
|
uci:save('simple-tc')
|
||||||
uci:commit('simple-tc')
|
|
||||||
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
@ -33,5 +33,4 @@ if sysconfig.gluon_version == 'legacy' then
|
|||||||
end
|
end
|
||||||
|
|
||||||
uci:save('fastd')
|
uci:save('fastd')
|
||||||
uci:commit('fastd')
|
|
||||||
end
|
end
|
||||||
|
@ -101,9 +101,7 @@ end
|
|||||||
function image_supported(tmpfile)
|
function image_supported(tmpfile)
|
||||||
-- XXX: yay...
|
-- XXX: yay...
|
||||||
return ( 0 == os.execute(
|
return ( 0 == os.execute(
|
||||||
". /lib/functions.sh; " ..
|
"/sbin/sysupgrade -T %q >/dev/null"
|
||||||
"include /lib/upgrade; " ..
|
|
||||||
"platform_check_image %q >/dev/null"
|
|
||||||
% tmpfile
|
% tmpfile
|
||||||
) )
|
) )
|
||||||
end
|
end
|
||||||
|
@ -45,4 +45,3 @@ end
|
|||||||
|
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
@ -45,4 +45,3 @@ end
|
|||||||
|
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
@ -5,7 +5,6 @@ local uci = require('luci.model.uci').cursor()
|
|||||||
|
|
||||||
|
|
||||||
-- fix up duplicate mac addresses (for mesh-on-WAN)
|
-- fix up duplicate mac addresses (for mesh-on-WAN)
|
||||||
uci:set('network', 'wan', 'macaddr', util.generate_mac(1, 0))
|
uci:set('network', 'wan', 'macaddr', util.generate_mac(3))
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ uci:section('batman-adv', 'mesh', 'bat0',
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
uci:save('batman-adv')
|
uci:save('batman-adv')
|
||||||
uci:commit('batman-adv')
|
|
||||||
|
|
||||||
if not uci:get('network', 'client', 'ifname') then
|
if not uci:get('network', 'client', 'ifname') then
|
||||||
uci:add_to_set('network', 'client', 'ifname', 'bat0')
|
uci:add_to_set('network', 'client', 'ifname', 'bat0')
|
||||||
@ -39,6 +38,9 @@ end
|
|||||||
uci:set('network', 'client', 'proto', 'dhcpv6')
|
uci:set('network', 'client', 'proto', 'dhcpv6')
|
||||||
uci:set('network', 'client', 'reqprefix', 'no')
|
uci:set('network', 'client', 'reqprefix', 'no')
|
||||||
uci:set('network', 'client', 'igmp_snooping', 0)
|
uci:set('network', 'client', 'igmp_snooping', 0)
|
||||||
|
uci:set('network', 'client', 'robustness', 3)
|
||||||
|
uci:set('network', 'client', 'query_interval', 2000)
|
||||||
|
uci:set('network', 'client', 'query_response_interval', 500)
|
||||||
uci:set('network', 'client', 'peerdns', 1)
|
uci:set('network', 'client', 'peerdns', 1)
|
||||||
uci:set('network', 'client', 'sourcefilter', 0)
|
uci:set('network', 'client', 'sourcefilter', 0)
|
||||||
|
|
||||||
@ -48,11 +50,11 @@ uci:section('network', 'interface', 'bat0',
|
|||||||
ifname = 'bat0',
|
ifname = 'bat0',
|
||||||
proto = 'none',
|
proto = 'none',
|
||||||
macaddr = sysconfig.primary_mac,
|
macaddr = sysconfig.primary_mac,
|
||||||
|
multicast_router = 2,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
|
||||||
|
|
||||||
uci:delete('firewall', 'client')
|
uci:delete('firewall', 'client')
|
||||||
@ -76,7 +78,6 @@ uci:section('firewall', 'rule', 'client_dns',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('firewall')
|
uci:save('firewall')
|
||||||
uci:commit('firewall')
|
|
||||||
|
|
||||||
|
|
||||||
local dnsmasq = uci:get_first('dhcp', 'dnsmasq')
|
local dnsmasq = uci:get_first('dhcp', 'dnsmasq')
|
||||||
@ -93,7 +94,6 @@ uci:section('dhcp', 'dhcp', 'client',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('dhcp')
|
uci:save('dhcp')
|
||||||
uci:commit('dhcp')
|
|
||||||
|
|
||||||
|
|
||||||
sysctl.set('net.ipv6.conf.br-client.forwarding', 0)
|
sysctl.set('net.ipv6.conf.br-client.forwarding', 0)
|
||||||
|
@ -29,7 +29,9 @@ local function configure_ibss(config, radio, index, suffix, disabled)
|
|||||||
uci:delete('network', name .. '_vlan')
|
uci:delete('network', name .. '_vlan')
|
||||||
uci:delete('wireless', name)
|
uci:delete('wireless', name)
|
||||||
|
|
||||||
if config then
|
macaddr = util.generate_mac(3*(index-1)+2)
|
||||||
|
|
||||||
|
if config and macaddr then
|
||||||
if config.vlan then
|
if config.vlan then
|
||||||
uci:section('network', 'interface', name,
|
uci:section('network', 'interface', name,
|
||||||
{
|
{
|
||||||
@ -60,7 +62,7 @@ local function configure_ibss(config, radio, index, suffix, disabled)
|
|||||||
mode = 'adhoc',
|
mode = 'adhoc',
|
||||||
ssid = config.ssid,
|
ssid = config.ssid,
|
||||||
bssid = config.bssid,
|
bssid = config.bssid,
|
||||||
macaddr = util.generate_mac(3, index),
|
macaddr = macaddr,
|
||||||
mcast_rate = config.mcast_rate,
|
mcast_rate = config.mcast_rate,
|
||||||
ifname = suffix and 'ibss' .. suffix,
|
ifname = suffix and 'ibss' .. suffix,
|
||||||
disabled = disabled and 1 or 0,
|
disabled = disabled and 1 or 0,
|
||||||
@ -77,7 +79,9 @@ local function configure_mesh(config, radio, index, suffix, disabled)
|
|||||||
uci:delete('network', name)
|
uci:delete('network', name)
|
||||||
uci:delete('wireless', name)
|
uci:delete('wireless', name)
|
||||||
|
|
||||||
if config then
|
macaddr = util.generate_mac(3*(index-1)+1)
|
||||||
|
|
||||||
|
if config and macaddr then
|
||||||
uci:section('network', 'interface', name,
|
uci:section('network', 'interface', name,
|
||||||
{
|
{
|
||||||
proto = 'batadv',
|
proto = 'batadv',
|
||||||
@ -92,7 +96,7 @@ local function configure_mesh(config, radio, index, suffix, disabled)
|
|||||||
mode = 'mesh',
|
mode = 'mesh',
|
||||||
mesh_id = config.id,
|
mesh_id = config.id,
|
||||||
mesh_fwding = 0,
|
mesh_fwding = 0,
|
||||||
macaddr = util.generate_mac(5, index),
|
macaddr = macaddr,
|
||||||
mcast_rate = config.mcast_rate,
|
mcast_rate = config.mcast_rate,
|
||||||
ifname = suffix and 'mesh' .. suffix,
|
ifname = suffix and 'mesh' .. suffix,
|
||||||
disabled = disabled and 1 or 0,
|
disabled = disabled and 1 or 0,
|
||||||
@ -131,5 +135,3 @@ util.iterate_radios(configure_radio)
|
|||||||
|
|
||||||
uci:save('wireless')
|
uci:save('wireless')
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('wireless')
|
|
||||||
uci:commit('network')
|
|
||||||
|
@ -16,4 +16,3 @@ if not c:get('network', 'mesh_wan') then
|
|||||||
end
|
end
|
||||||
|
|
||||||
c:save('network')
|
c:save('network')
|
||||||
c:commit('network')
|
|
||||||
|
@ -7,7 +7,21 @@ local sysconfig = require 'gluon.sysconfig'
|
|||||||
local uci = require('luci.model.uci').cursor()
|
local uci = require('luci.model.uci').cursor()
|
||||||
local lutil = require 'luci.util'
|
local lutil = require 'luci.util'
|
||||||
|
|
||||||
if sysconfig.lan_ifname and not uci:get('network', 'mesh_lan') then
|
if not sysconfig.lan_ifname then
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
uci:section('network', 'interface', 'mesh_lan', {
|
||||||
|
ifname = sysconfig.lan_ifname,
|
||||||
|
type = 'bridge',
|
||||||
|
igmp_snooping = 0,
|
||||||
|
proto = 'batadv',
|
||||||
|
mesh = 'bat0',
|
||||||
|
mesh_no_rebroadcast = '1',
|
||||||
|
macaddr = util.generate_mac(6),
|
||||||
|
})
|
||||||
|
|
||||||
|
if uci:get('network', 'mesh_lan', 'auto') == nil then
|
||||||
local enable = site.mesh_on_lan
|
local enable = site.mesh_on_lan
|
||||||
|
|
||||||
if enable then
|
if enable then
|
||||||
@ -15,23 +29,15 @@ if sysconfig.lan_ifname and not uci:get('network', 'mesh_lan') then
|
|||||||
|
|
||||||
if interfaces then
|
if interfaces then
|
||||||
for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do
|
for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do
|
||||||
if lutil.contains(interfaces, lanif) then
|
if lutil.contains(interfaces, lanif) then
|
||||||
enable = false
|
enable = false
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
uci:section('network', 'interface', 'mesh_lan',
|
uci:set('network', 'mesh_lan', 'auto', enable and 1 or 0)
|
||||||
{ ifname = sysconfig.lan_ifname
|
|
||||||
, proto = 'batadv'
|
|
||||||
, mesh = 'bat0'
|
|
||||||
, mesh_no_rebroadcast = '1'
|
|
||||||
, macaddr = util.generate_mac(1, 1)
|
|
||||||
, auto = enable and 1 or 0
|
|
||||||
})
|
|
||||||
|
|
||||||
uci:save('network')
|
|
||||||
uci:commit('network')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
uci:save('network')
|
||||||
|
@ -3,8 +3,11 @@
|
|||||||
local uci = require('luci.model.uci').cursor()
|
local uci = require('luci.model.uci').cursor()
|
||||||
|
|
||||||
if uci:get('system', 'rssid_wlan0') then
|
if uci:get('system', 'rssid_wlan0') then
|
||||||
uci:set('system', 'rssid_wlan0', 'dev', 'mesh0')
|
if uci:get('wireless', 'mesh_radio0') then
|
||||||
|
uci:set('system', 'rssid_wlan0', 'dev', 'mesh0')
|
||||||
|
else
|
||||||
|
uci:set('system', 'rssid_wlan0', 'dev', 'ibss0')
|
||||||
|
end
|
||||||
|
|
||||||
uci:save('system')
|
uci:save('system')
|
||||||
uci:commit('system')
|
|
||||||
end
|
end
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
local nixio = require 'nixio'
|
|
||||||
|
|
||||||
module 'gluon.batman_adv'
|
|
||||||
|
|
||||||
function interfaces(bat_if)
|
|
||||||
local iter = nixio.fs.glob('/sys/class/net/' .. bat_if .. '/lower_*')
|
|
||||||
return function()
|
|
||||||
local path = iter()
|
|
||||||
if path == nil then
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
local ifname = path:match('/lower_([^/]+)$')
|
|
||||||
return ifname
|
|
||||||
end
|
|
||||||
end
|
|
@ -501,7 +501,9 @@ static struct json_object * get_batadv(void) {
|
|||||||
|
|
||||||
struct json_object *obj = json_object_new_object();
|
struct json_object *obj = json_object_new_object();
|
||||||
json_object_object_add(obj, "tq", json_object_new_int(tq));
|
json_object_object_add(obj, "tq", json_object_new_int(tq));
|
||||||
json_object_object_add(obj, "lastseen", json_object_new_double(lastseen));
|
struct json_object *jso = json_object_new_double(lastseen);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.3f", NULL);
|
||||||
|
json_object_object_add(obj, "lastseen", jso);
|
||||||
json_object_object_add(interface, mac1, obj);
|
json_object_object_add(interface, mac1, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ define Package/gluon-mesh-vpn-fastd
|
|||||||
SECTION:=gluon
|
SECTION:=gluon
|
||||||
CATEGORY:=Gluon
|
CATEGORY:=Gluon
|
||||||
TITLE:=Support for connecting batman-adv meshes via fastd
|
TITLE:=Support for connecting batman-adv meshes via fastd
|
||||||
DEPENDS:=+gluon-core +libgluonutil gluon-mesh-batman-adv +gluon-wan-dnsmasq +fastd +iptables-mod-extra +simple-tc
|
DEPENDS:=+gluon-core +libgluonutil gluon-mesh-batman-adv +gluon-wan-dnsmasq +fastd +iptables +iptables-mod-extra +simple-tc
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
|
@ -119,7 +119,6 @@ add_groups('mesh_vpn', site.fastd_mesh_vpn.groups)
|
|||||||
|
|
||||||
|
|
||||||
uci:save('fastd')
|
uci:save('fastd')
|
||||||
uci:commit('fastd')
|
|
||||||
|
|
||||||
|
|
||||||
uci:section('network', 'interface', 'mesh_vpn',
|
uci:section('network', 'interface', 'mesh_vpn',
|
||||||
@ -128,12 +127,11 @@ uci:section('network', 'interface', 'mesh_vpn',
|
|||||||
proto = 'batadv',
|
proto = 'batadv',
|
||||||
mesh = 'bat0',
|
mesh = 'bat0',
|
||||||
mesh_no_rebroadcast = 1,
|
mesh_no_rebroadcast = 1,
|
||||||
macaddr = util.generate_mac(4, 0),
|
macaddr = util.generate_mac(0),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
uci:save('network')
|
uci:save('network')
|
||||||
uci:commit('network')
|
|
||||||
|
|
||||||
|
|
||||||
uci:section('firewall', 'include', 'mesh_vpn_dns',
|
uci:section('firewall', 'include', 'mesh_vpn_dns',
|
||||||
@ -145,4 +143,3 @@ uci:section('firewall', 'include', 'mesh_vpn_dns',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('firewall')
|
uci:save('firewall')
|
||||||
uci:commit('firewall')
|
|
||||||
|
@ -9,5 +9,4 @@ local secret = c:get("fastd", "mesh_vpn", "secret")
|
|||||||
if not secret or not secret:match(("%x"):rep(64)) then
|
if not secret or not secret:match(("%x"):rep(64)) then
|
||||||
c:set("fastd", "mesh_vpn", "secret", "generate")
|
c:set("fastd", "mesh_vpn", "secret", "generate")
|
||||||
c:save("fastd")
|
c:save("fastd")
|
||||||
c:commit("fastd")
|
|
||||||
end
|
end
|
||||||
|
@ -28,5 +28,4 @@ if not uci:get('simple-tc', 'mesh_vpn') then
|
|||||||
|
|
||||||
uci:section('simple-tc', 'interface', 'mesh_vpn', config)
|
uci:section('simple-tc', 'interface', 'mesh_vpn', config)
|
||||||
uci:save('simple-tc')
|
uci:save('simple-tc')
|
||||||
uci:commit('simple-tc')
|
|
||||||
end
|
end
|
||||||
|
@ -192,7 +192,9 @@ static bool get_peer_connection(struct json_object **ret, struct json_object *co
|
|||||||
int64_t established_time = json_object_get_int64(established);
|
int64_t established_time = json_object_get_int64(established);
|
||||||
|
|
||||||
*ret = json_object_new_object();
|
*ret = json_object_new_object();
|
||||||
json_object_object_add(*ret, "established", json_object_new_double(established_time/1000.0));
|
struct json_object *jso = json_object_new_double(established_time/1000.0);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.3f", NULL);
|
||||||
|
json_object_object_add(*ret, "established", jso);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*ret = NULL;
|
*ret = NULL;
|
||||||
|
@ -17,4 +17,3 @@ uci:section('firewall', 'rule', 'wan_respondd_reply',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('firewall')
|
uci:save('firewall')
|
||||||
uci:commit('firewall')
|
|
||||||
|
@ -39,7 +39,6 @@ c:section('network', 'route6', 'local_node_route6',
|
|||||||
)
|
)
|
||||||
|
|
||||||
c:save('network')
|
c:save('network')
|
||||||
c:commit('network')
|
|
||||||
|
|
||||||
c:delete('firewall', 'local_node')
|
c:delete('firewall', 'local_node')
|
||||||
c:section('firewall', 'zone', 'local_node',
|
c:section('firewall', 'zone', 'local_node',
|
||||||
@ -52,4 +51,3 @@ c:section('firewall', 'zone', 'local_node',
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
c:save('firewall')
|
c:save('firewall')
|
||||||
c:commit('firewall')
|
|
||||||
|
@ -7,5 +7,4 @@ local config = 'gluon-node-info'
|
|||||||
if not uci:get_first(config, 'system') then
|
if not uci:get_first(config, 'system') then
|
||||||
uci:section(config, 'system')
|
uci:section(config, 'system')
|
||||||
uci:save(config)
|
uci:save(config)
|
||||||
uci:commit(config)
|
|
||||||
end
|
end
|
||||||
|
@ -15,5 +15,4 @@ end
|
|||||||
if not role then
|
if not role then
|
||||||
uci:set(config, uci:get_first(config, 'system'), 'role', default_role)
|
uci:set(config, uci:get_first(config, 'system'), 'role', default_role)
|
||||||
uci:save(config)
|
uci:save(config)
|
||||||
uci:commit(config)
|
|
||||||
end
|
end
|
||||||
|
14
package/gluon-node-info/files/lib/gluon/upgrade/520-node-info-whitespace-fix
Executable file
14
package/gluon-node-info/files/lib/gluon/upgrade/520-node-info-whitespace-fix
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/lua
|
||||||
|
local uci = require('luci.model.uci').cursor()
|
||||||
|
|
||||||
|
local sname = uci:get_first('gluon-node-info', 'location')
|
||||||
|
if sname then
|
||||||
|
local options = {'longitude', 'latitude', 'altitude'}
|
||||||
|
for _, option in ipairs(options) do
|
||||||
|
local value = uci:get('gluon-node-info', sname, option)
|
||||||
|
if value then
|
||||||
|
uci:set('gluon-node-info', sname, option, value:trim())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
uci:save('gluon-node-info')
|
||||||
|
end
|
@ -64,7 +64,15 @@ static struct json_object * get_number(struct uci_context *ctx, struct uci_secti
|
|||||||
if (*end)
|
if (*end)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return json_object_new_double(d);
|
struct json_object *jso = json_object_new_double(d);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.8f", NULL);
|
||||||
|
return jso;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void maybe_add_number(struct uci_context *ctx, struct uci_section *s, const char *name, struct json_object *parent) {
|
||||||
|
struct json_object *jso = get_number(ctx, s, name);
|
||||||
|
if (jso)
|
||||||
|
json_object_object_add(parent, name, jso);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct json_object * get_location(struct uci_context *ctx, struct uci_package *p) {
|
static struct json_object * get_location(struct uci_context *ctx, struct uci_package *p) {
|
||||||
@ -78,17 +86,9 @@ static struct json_object * get_location(struct uci_context *ctx, struct uci_pac
|
|||||||
|
|
||||||
struct json_object *ret = json_object_new_object();
|
struct json_object *ret = json_object_new_object();
|
||||||
|
|
||||||
struct json_object *latitude = get_number(ctx, s, "latitude");
|
maybe_add_number(ctx, s, "latitude", ret);
|
||||||
if (latitude)
|
maybe_add_number(ctx, s, "longitude", ret);
|
||||||
json_object_object_add(ret, "latitude", latitude);
|
maybe_add_number(ctx, s, "altitude", ret);
|
||||||
|
|
||||||
struct json_object *longitude = get_number(ctx, s, "longitude");
|
|
||||||
if (longitude)
|
|
||||||
json_object_object_add(ret, "longitude", longitude);
|
|
||||||
|
|
||||||
struct json_object *altitude = get_number(ctx, s, "altitude");
|
|
||||||
if (altitude)
|
|
||||||
json_object_object_add(ret, "altitude", altitude);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -29,4 +29,3 @@ uci:section('firewall', 'rule', 'client_respondd',
|
|||||||
)
|
)
|
||||||
|
|
||||||
uci:save('firewall')
|
uci:save('firewall')
|
||||||
uci:commit('firewall')
|
|
||||||
|
@ -107,13 +107,18 @@ static struct json_object * respondd_provider_nodeinfo(void) {
|
|||||||
|
|
||||||
static void add_uptime(struct json_object *obj) {
|
static void add_uptime(struct json_object *obj) {
|
||||||
FILE *f = fopen("/proc/uptime", "r");
|
FILE *f = fopen("/proc/uptime", "r");
|
||||||
|
struct json_object* jso;
|
||||||
if (!f)
|
if (!f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
double uptime, idletime;
|
double uptime, idletime;
|
||||||
if (fscanf(f, "%lf %lf", &uptime, &idletime) == 2) {
|
if (fscanf(f, "%lf %lf", &uptime, &idletime) == 2) {
|
||||||
json_object_object_add(obj, "uptime", json_object_new_double(uptime));
|
jso = json_object_new_double(uptime);
|
||||||
json_object_object_add(obj, "idletime", json_object_new_double(idletime));
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
|
||||||
|
json_object_object_add(obj, "uptime", jso);
|
||||||
|
jso = json_object_new_double(idletime);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
|
||||||
|
json_object_object_add(obj, "idletime", jso);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@ -127,7 +132,9 @@ static void add_loadavg(struct json_object *obj) {
|
|||||||
double loadavg;
|
double loadavg;
|
||||||
unsigned proc_running, proc_total;
|
unsigned proc_running, proc_total;
|
||||||
if (fscanf(f, "%lf %*f %*f %u/%u", &loadavg, &proc_running, &proc_total) == 3) {
|
if (fscanf(f, "%lf %*f %*f %u/%u", &loadavg, &proc_running, &proc_total) == 3) {
|
||||||
json_object_object_add(obj, "loadavg", json_object_new_double(loadavg));
|
struct json_object *jso = json_object_new_double(loadavg);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
|
||||||
|
json_object_object_add(obj, "loadavg", jso);
|
||||||
|
|
||||||
struct json_object *processes = json_object_new_object();
|
struct json_object *processes = json_object_new_object();
|
||||||
json_object_object_add(processes, "running", json_object_new_int(proc_running));
|
json_object_object_add(processes, "running", json_object_new_int(proc_running));
|
||||||
@ -176,7 +183,9 @@ static struct json_object * get_rootfs_usage(void) {
|
|||||||
if (statfs("/", &s))
|
if (statfs("/", &s))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return json_object_new_double(1 - (double)s.f_bfree / s.f_blocks);
|
struct json_object *jso = json_object_new_double(1 - (double)s.f_bfree / s.f_blocks);
|
||||||
|
json_object_set_serializer(jso, json_object_double_to_json_string, "%.4f", NULL);
|
||||||
|
return jso;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct json_object * respondd_provider_statistics(void) {
|
static struct json_object * respondd_provider_statistics(void) {
|
||||||
|
@ -11,6 +11,5 @@ if site.setup_mode
|
|||||||
local name = c:get_first("gluon-setup-mode", "setup_mode")
|
local name = c:get_first("gluon-setup-mode", "setup_mode")
|
||||||
c:set("gluon-setup-mode", name, "configured", 1)
|
c:set("gluon-setup-mode", name, "configured", 1)
|
||||||
c:save('gluon-setup-mode')
|
c:save('gluon-setup-mode')
|
||||||
c:commit('gluon-setup-mode')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ if old == '1' then
|
|||||||
c:set('gluon-setup-mode', setup_mode, 'configured', '1')
|
c:set('gluon-setup-mode', setup_mode, 'configured', '1')
|
||||||
|
|
||||||
c:save('gluon-setup-mode')
|
c:save('gluon-setup-mode')
|
||||||
c:commit('gluon-setup-mode')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
os.remove('/etc/config/gluon-config-mode')
|
os.remove('/etc/config/gluon-config-mode')
|
||||||
|
@ -8,7 +8,7 @@ if sysconfig.setup_ifname then
|
|||||||
os.exit(0)
|
os.exit(0)
|
||||||
end
|
end
|
||||||
|
|
||||||
if platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus'}) then
|
if platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then
|
||||||
sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.wan_ifname or sysconfig.lan_ifname
|
sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.wan_ifname or sysconfig.lan_ifname
|
||||||
else
|
else
|
||||||
sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.lan_ifname or sysconfig.wan_ifname
|
sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.lan_ifname or sysconfig.wan_ifname
|
||||||
|
@ -10,6 +10,4 @@ uci batch <<-EOF
|
|||||||
set uhttpd.main.home=/lib/gluon/status-page/www
|
set uhttpd.main.home=/lib/gluon/status-page/www
|
||||||
|
|
||||||
set uhttpd.main.max_requests=32
|
set uhttpd.main.max_requests=32
|
||||||
|
|
||||||
commit uhttpd
|
|
||||||
EOF
|
EOF
|
||||||
|
@ -1,160 +0,0 @@
|
|||||||
#!/usr/bin/lua
|
|
||||||
|
|
||||||
local util = require("luci.util")
|
|
||||||
local fs = require("nixio.fs")
|
|
||||||
local ltn12 = require 'luci.ltn12'
|
|
||||||
local sys = require("luci.sys")
|
|
||||||
local json = require("luci.jsonc")
|
|
||||||
local nixio = require 'nixio'
|
|
||||||
local platform_info = require("platform_info")
|
|
||||||
|
|
||||||
local hostname = sys.hostname()
|
|
||||||
local model = platform_info.get_model()
|
|
||||||
local release = util.trim(fs.readfile("/lib/gluon/release") or "")
|
|
||||||
|
|
||||||
function escape_html(s)
|
|
||||||
return (s:gsub('&', '&'):gsub('<', '<'):gsub('>', '>'):gsub('"', '"'))
|
|
||||||
end
|
|
||||||
|
|
||||||
function neighbours(ifname)
|
|
||||||
local info = util.exec("gluon-neighbour-info -d ff02::2:1001 -p 1001 -r nodeinfo -t 3 -i " .. ifname)
|
|
||||||
local macs = {}
|
|
||||||
for _, line in ipairs(util.split(info)) do
|
|
||||||
local data = json.parse(line)
|
|
||||||
if data then
|
|
||||||
local function add_macs(list)
|
|
||||||
if list then
|
|
||||||
for _, mac in ipairs(list) do
|
|
||||||
macs[mac] = data
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if data["network"] then
|
|
||||||
add_macs(data["network"]["mesh_interfaces"])
|
|
||||||
|
|
||||||
if data["network"]["mesh"] and data["network"]["mesh"]["bat0"] and
|
|
||||||
data["network"]["mesh"]["bat0"]["interfaces"] then
|
|
||||||
local interfaces = data["network"]["mesh"]["bat0"]["interfaces"]
|
|
||||||
add_macs(interfaces["other"])
|
|
||||||
add_macs(interfaces["wireless"])
|
|
||||||
add_macs(interfaces["tunnel"])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return macs
|
|
||||||
end
|
|
||||||
|
|
||||||
io.write("Content-type: text/html\n\n")
|
|
||||||
io.write("<!DOCTYPE html>\n")
|
|
||||||
io.write("<html>")
|
|
||||||
io.write("<head>")
|
|
||||||
io.write("<meta charset=\"utf-8\"/>")
|
|
||||||
io.write("<script src=\"/status.js\"></script>")
|
|
||||||
io.write("<title>" .. escape_html(hostname) .. "</title>")
|
|
||||||
io.write("</head>")
|
|
||||||
io.write("<body>")
|
|
||||||
|
|
||||||
io.write("<h1>" .. escape_html(hostname) .. "</h1>")
|
|
||||||
io.write("<pre>")
|
|
||||||
|
|
||||||
io.write("Model: " .. escape_html(model) .. "\n")
|
|
||||||
io.write("Firmware release: " .. escape_html(release) .. "\n\n")
|
|
||||||
|
|
||||||
io.write(escape_html(util.trim(sys.exec("uptime | sed 's/^ \+//'"))) .. "\n\n")
|
|
||||||
io.write(escape_html(sys.exec("ip address show dev br-client")) .. "\n")
|
|
||||||
io.write(escape_html(sys.exec("free -m")) .. "\n")
|
|
||||||
io.write(escape_html(sys.exec("df /rom /overlay")))
|
|
||||||
io.write("</pre>")
|
|
||||||
|
|
||||||
io.write("<h2>Neighbours</h2>")
|
|
||||||
|
|
||||||
local interfaces = util.split(util.trim(util.exec("iw dev | egrep 'type IBSS|type mesh' -B 5 | grep Interface | cut -d' ' -f2")))
|
|
||||||
|
|
||||||
for _, ifname in ipairs(interfaces) do
|
|
||||||
io.write("<h3>" .. escape_html(ifname) .. "</h3>")
|
|
||||||
io.write("<pre>")
|
|
||||||
|
|
||||||
for _, line in ipairs(util.split(util.exec("iw dev " .. ifname .. " station dump"))) do
|
|
||||||
local mac = line:match("^Station (.*) %(on ")
|
|
||||||
if mac then
|
|
||||||
io.write("Station <a id=\"" .. escape_html(ifname) .. "-" .. mac .. "\">" .. mac .. "</a> (on " .. escape_html(ifname) .. ")\n")
|
|
||||||
else
|
|
||||||
io.write(escape_html(line) .. "\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
io.write("</pre>")
|
|
||||||
end
|
|
||||||
|
|
||||||
local stat, fastd_status = pcall(
|
|
||||||
function()
|
|
||||||
local fastd_sock = nixio.socket('unix', 'stream')
|
|
||||||
assert(fastd_sock:connect('/var/run/fastd.mesh_vpn.socket'))
|
|
||||||
|
|
||||||
decoder = json.new()
|
|
||||||
ltn12.pump.all(ltn12.source.file(fastd_sock), decoder:sink())
|
|
||||||
return decoder:get()
|
|
||||||
end
|
|
||||||
)
|
|
||||||
|
|
||||||
io.write("<h2>VPN status</h2>")
|
|
||||||
io.write("<pre>")
|
|
||||||
|
|
||||||
if stat then
|
|
||||||
io.write(string.format("fastd running for %.3f seconds\n", fastd_status.uptime/1000))
|
|
||||||
|
|
||||||
local peers = 0
|
|
||||||
local connections = 0
|
|
||||||
|
|
||||||
for key, peer in pairs(fastd_status.peers) do
|
|
||||||
peers = peers+1
|
|
||||||
|
|
||||||
if peer.connection then
|
|
||||||
connections = connections+1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
io.write(string.format("There are %i peers configured, of which %i are connected:\n\n", peers, connections))
|
|
||||||
|
|
||||||
for key, peer in pairs(fastd_status.peers) do
|
|
||||||
io.write(string.format("%s: ", escape_html(peer.name)))
|
|
||||||
|
|
||||||
if peer.connection then
|
|
||||||
io.write(string.format("connected for %.3f seconds\n", peer.connection.established/1000))
|
|
||||||
else
|
|
||||||
io.write("not connected\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
io.write("fastd not running")
|
|
||||||
end
|
|
||||||
|
|
||||||
io.write("</pre>")
|
|
||||||
|
|
||||||
io.write("<script>")
|
|
||||||
for _, ifname in ipairs(interfaces) do
|
|
||||||
local macs = neighbours(ifname)
|
|
||||||
for mac, node in pairs(macs) do
|
|
||||||
local hostname = node["hostname"]
|
|
||||||
local ip
|
|
||||||
if node["network"] and node["network"]["addresses"] then
|
|
||||||
for _, myip in ipairs(node["network"]["addresses"]) do
|
|
||||||
if ip == nil and myip:sub(1, 5) ~= "fe80:" then
|
|
||||||
ip = myip
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if ip and hostname then
|
|
||||||
io.write("update_node(\"" .. escape_html(ifname) .. "-" .. mac .. "\", \"" .. escape_html(ip) .. "\", \"" .. escape_html(hostname) .. "\");")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
io.write("</script>")
|
|
||||||
io.write("</body>")
|
|
||||||
io.write("</html>")
|
|
@ -1,9 +0,0 @@
|
|||||||
function update_node(id, ip, hostname) {
|
|
||||||
var el = document.getElementById(id);
|
|
||||||
|
|
||||||
if (!el)
|
|
||||||
return;
|
|
||||||
|
|
||||||
el.href = "http://[" + ip + "]/";
|
|
||||||
el.textContent += " (" + hostname + ")";
|
|
||||||
}
|
|
@ -31,20 +31,13 @@ function (Helper, SignalGraph, Signal) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function TableEntry(parent, nodeInfo, color, stream, mgmtBus, signal) {
|
function TableEntry(parent, nodeInfo, color, stream, mgmtBus, signal) {
|
||||||
var el = document.createElement("tr")
|
var el = parent.insertRow()
|
||||||
parent.appendChild(el)
|
|
||||||
|
|
||||||
var tdHostname = document.createElement("td")
|
var tdHostname = el.insertCell()
|
||||||
var tdTQ = document.createElement("td")
|
var tdTQ = el.insertCell()
|
||||||
var tdSignal = document.createElement("td")
|
var tdSignal = el.insertCell()
|
||||||
var tdDistance = document.createElement("td")
|
var tdDistance = el.insertCell()
|
||||||
var tdInactive = document.createElement("td")
|
var tdInactive = el.insertCell()
|
||||||
|
|
||||||
el.appendChild(tdHostname)
|
|
||||||
el.appendChild(tdTQ)
|
|
||||||
el.appendChild(tdSignal)
|
|
||||||
el.appendChild(tdDistance)
|
|
||||||
el.appendChild(tdInactive)
|
|
||||||
|
|
||||||
var marker = document.createElement("span")
|
var marker = document.createElement("span")
|
||||||
marker.textContent = "⬤ "
|
marker.textContent = "⬤ "
|
||||||
@ -69,7 +62,7 @@ function (Helper, SignalGraph, Signal) {
|
|||||||
|
|
||||||
el.destroy = function () {
|
el.destroy = function () {
|
||||||
unsubscribe()
|
unsubscribe()
|
||||||
parent.removeChild(el)
|
parent.tBodies[0].removeChild(el)
|
||||||
}
|
}
|
||||||
|
|
||||||
return el
|
return el
|
||||||
@ -135,8 +128,7 @@ function (Helper, SignalGraph, Signal) {
|
|||||||
el.appendChild(h)
|
el.appendChild(h)
|
||||||
|
|
||||||
var table = document.createElement("table")
|
var table = document.createElement("table")
|
||||||
var tr = document.createElement("tr")
|
var tr = table.insertRow()
|
||||||
table.appendChild(tr)
|
|
||||||
table.classList.add("datatable")
|
table.classList.add("datatable")
|
||||||
|
|
||||||
var th = document.createElement("th")
|
var th = document.createElement("th")
|
||||||
|
@ -22,28 +22,38 @@ define(["lib/helper"], function (Helper) {
|
|||||||
return el
|
return el
|
||||||
}
|
}
|
||||||
|
|
||||||
function mkRow(table, label, stream) {
|
function mkRow(table, label, stream, sorted) {
|
||||||
var tr = document.createElement("tr")
|
|
||||||
|
var i = -1
|
||||||
|
|
||||||
|
if (sorted) {
|
||||||
|
for (i = 0; i < table.rows.length; i++) {
|
||||||
|
if (label < table.rows[i].firstChild.textContent)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tr = table.insertRow(i)
|
||||||
var th = document.createElement("th")
|
var th = document.createElement("th")
|
||||||
var td = streamElement("td", stream)
|
var td = streamElement("td", stream)
|
||||||
th.textContent = label
|
th.textContent = label
|
||||||
tr.appendChild(th)
|
tr.appendChild(th)
|
||||||
tr.appendChild(td)
|
tr.appendChild(td)
|
||||||
table.appendChild(tr)
|
|
||||||
|
|
||||||
tr.destroy = function () {
|
tr.destroy = function () {
|
||||||
td.destroy()
|
td.destroy()
|
||||||
table.removeChild(tr)
|
table.tBodies[0].removeChild(tr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return tr
|
return tr
|
||||||
}
|
}
|
||||||
|
|
||||||
function mkTrafficRow(table, children, label, stream, selector) {
|
function mkTrafficRow(table, children, label, stream, selector) {
|
||||||
var tr = document.createElement("tr")
|
var tr = table.insertRow()
|
||||||
var th = document.createElement("th")
|
var th = document.createElement("th")
|
||||||
var td = document.createElement("td")
|
|
||||||
th.textContent = label
|
th.textContent = label
|
||||||
|
tr.appendChild(th)
|
||||||
|
var td = tr.insertCell()
|
||||||
|
|
||||||
var traffic = stream.slidingWindow(2, 2)
|
var traffic = stream.slidingWindow(2, 2)
|
||||||
var pkts = streamNode(traffic.map(deltaUptime(selector + ".packets")).map(prettyPackets))
|
var pkts = streamNode(traffic.map(deltaUptime(selector + ".packets")).map(prettyPackets))
|
||||||
@ -56,10 +66,6 @@ define(["lib/helper"], function (Helper) {
|
|||||||
td.appendChild(document.createElement("br"))
|
td.appendChild(document.createElement("br"))
|
||||||
td.appendChild(bytes)
|
td.appendChild(bytes)
|
||||||
|
|
||||||
tr.appendChild(th)
|
|
||||||
tr.appendChild(td)
|
|
||||||
table.appendChild(tr)
|
|
||||||
|
|
||||||
children.push(pkts)
|
children.push(pkts)
|
||||||
children.push(bw)
|
children.push(bw)
|
||||||
children.push(bytes)
|
children.push(bytes)
|
||||||
@ -127,7 +133,7 @@ define(["lib/helper"], function (Helper) {
|
|||||||
stream.startWith(d)
|
stream.startWith(d)
|
||||||
.map(peer.path)
|
.map(peer.path)
|
||||||
.filter(function (d) { return d !== undefined })
|
.filter(function (d) { return d !== undefined })
|
||||||
.map(prettyPeer))
|
.map(prettyPeer), true)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection
|
|||||||
Signed-off-by: Neal Oakey <neal.oakey@bingo-ev.de>
|
Signed-off-by: Neal Oakey <neal.oakey@bingo-ev.de>
|
||||||
|
|
||||||
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
index d0abf42..f345fae 100755
|
index dab4d2c..e7b3cd2 100755
|
||||||
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
@@ -64,6 +64,40 @@ wndr3700_board_detect() {
|
@@ -64,6 +64,40 @@ wndr3700_board_detect() {
|
||||||
@ -49,7 +49,7 @@ index d0abf42..f345fae 100755
|
|||||||
cybertan_get_hw_magic() {
|
cybertan_get_hw_magic() {
|
||||||
local part
|
local part
|
||||||
|
|
||||||
@@ -472,12 +506,14 @@ ar71xx_board_detect() {
|
@@ -475,12 +509,14 @@ ar71xx_board_detect() {
|
||||||
;;
|
;;
|
||||||
*"Bullet M")
|
*"Bullet M")
|
||||||
name="bullet-m"
|
name="bullet-m"
|
||||||
@ -64,7 +64,7 @@ index d0abf42..f345fae 100755
|
|||||||
;;
|
;;
|
||||||
*"Nanostation M XW")
|
*"Nanostation M XW")
|
||||||
name="nanostation-m-xw"
|
name="nanostation-m-xw"
|
||||||
@@ -664,6 +700,7 @@ ar71xx_board_detect() {
|
@@ -667,6 +703,7 @@ ar71xx_board_detect() {
|
||||||
;;
|
;;
|
||||||
*"Rocket M")
|
*"Rocket M")
|
||||||
name="rocket-m"
|
name="rocket-m"
|
||||||
|
@ -3,7 +3,7 @@ Date: Wed, 9 Mar 2016 06:46:44 +0100
|
|||||||
Subject: netifd: update to latest git master
|
Subject: netifd: update to latest git master
|
||||||
|
|
||||||
diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile
|
diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile
|
||||||
index 619024b..f7563d5 100644
|
index 619024b..84a4592 100644
|
||||||
--- a/package/network/config/netifd/Makefile
|
--- a/package/network/config/netifd/Makefile
|
||||||
+++ b/package/network/config/netifd/Makefile
|
+++ b/package/network/config/netifd/Makefile
|
||||||
@@ -1,13 +1,13 @@
|
@@ -1,13 +1,13 @@
|
||||||
@ -11,7 +11,7 @@ index 619024b..f7563d5 100644
|
|||||||
|
|
||||||
PKG_NAME:=netifd
|
PKG_NAME:=netifd
|
||||||
-PKG_VERSION:=2015-12-16
|
-PKG_VERSION:=2015-12-16
|
||||||
+PKG_VERSION:=2016-03-07
|
+PKG_VERSION:=2016-03-31
|
||||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
@ -19,7 +19,7 @@ index 619024b..f7563d5 100644
|
|||||||
+PKG_SOURCE_URL=$(OPENWRT_GIT)/project/netifd.git
|
+PKG_SOURCE_URL=$(OPENWRT_GIT)/project/netifd.git
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
-PKG_SOURCE_VERSION:=245527193e90906451be35c2b8e972b8712ea6ab
|
-PKG_SOURCE_VERSION:=245527193e90906451be35c2b8e972b8712ea6ab
|
||||||
+PKG_SOURCE_VERSION:=bd1ee3efb46ae013d81b1aec51668e7595274e69
|
+PKG_SOURCE_VERSION:=6fd6be6b7f3fc4883fdc464fcbcb2b5e8d8e8174
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
|
PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
|
||||||
# PKG_MIRROR_MD5SUM:=
|
# PKG_MIRROR_MD5SUM:=
|
||||||
@ -53,3 +53,130 @@ index af3aaa8..5515b91 100755
|
|||||||
for dev in $(echo "$radio_devs" | sort -u); do
|
for dev in $(echo "$radio_devs" | sort -u); do
|
||||||
/sbin/wifi up "$dev"
|
/sbin/wifi up "$dev"
|
||||||
done
|
done
|
||||||
|
diff --git a/package/network/config/netifd/patches/0001-Revert-device-Don-t-process-link-events-anymore-in-d.patch b/package/network/config/netifd/patches/0001-Revert-device-Don-t-process-link-events-anymore-in-d.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..312964f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/package/network/config/netifd/patches/0001-Revert-device-Don-t-process-link-events-anymore-in-d.patch
|
||||||
|
@@ -0,0 +1,121 @@
|
||||||
|
+From e0f19fdae88f3ef505e22533915f8328f4793980 Mon Sep 17 00:00:00 2001
|
||||||
|
+Message-Id: <e0f19fdae88f3ef505e22533915f8328f4793980.1462479663.git.mschiffer@universe-factory.net>
|
||||||
|
+From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
+Date: Thu, 5 May 2016 21:49:33 +0200
|
||||||
|
+Subject: [PATCH] Revert "device: Don't process link events anymore in device
|
||||||
|
+ user specific callback handlers"
|
||||||
|
+
|
||||||
|
+This reverts commit 4902ba2999dec02e82066d70ab6096b852a33007.
|
||||||
|
+---
|
||||||
|
+ device.h | 2 ++
|
||||||
|
+ macvlan.c | 8 ++++++++
|
||||||
|
+ system-linux.c | 2 +-
|
||||||
|
+ vlan.c | 6 ++++++
|
||||||
|
+ vlandev.c | 8 ++++++++
|
||||||
|
+ 5 files changed, 25 insertions(+), 1 deletion(-)
|
||||||
|
+
|
||||||
|
+diff --git a/device.h b/device.h
|
||||||
|
+index ac77cfb..ef1c608 100644
|
||||||
|
+--- a/device.h
|
||||||
|
++++ b/device.h
|
||||||
|
+@@ -59,6 +59,8 @@ struct device_type {
|
||||||
|
+ struct list_head list;
|
||||||
|
+ const char *name;
|
||||||
|
+
|
||||||
|
++ bool keep_link_status;
|
||||||
|
++
|
||||||
|
+ const struct uci_blob_param_list *config_params;
|
||||||
|
+
|
||||||
|
+ struct device *(*create)(const char *name, struct blob_attr *attr);
|
||||||
|
+diff --git a/macvlan.c b/macvlan.c
|
||||||
|
+index a0f11ae..051fe05 100644
|
||||||
|
+--- a/macvlan.c
|
||||||
|
++++ b/macvlan.c
|
||||||
|
+@@ -72,6 +72,12 @@ macvlan_base_cb(struct device_user *dev, enum device_event ev)
|
||||||
|
+ case DEV_EVENT_REMOVE:
|
||||||
|
+ device_set_present(&mvdev->dev, false);
|
||||||
|
+ break;
|
||||||
|
++ case DEV_EVENT_LINK_UP:
|
||||||
|
++ device_set_link(&mvdev->dev, true);
|
||||||
|
++ break;
|
||||||
|
++ case DEV_EVENT_LINK_DOWN:
|
||||||
|
++ device_set_link(&mvdev->dev, false);
|
||||||
|
++ break;
|
||||||
|
+ default:
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+@@ -255,6 +261,8 @@ macvlan_create(const char *name, struct blob_attr *attr)
|
||||||
|
+ const struct device_type macvlan_device_type = {
|
||||||
|
+ .name = "MAC VLAN",
|
||||||
|
+ .config_params = &macvlan_attr_list,
|
||||||
|
++ .keep_link_status = true,
|
||||||
|
++
|
||||||
|
+ .create = macvlan_create,
|
||||||
|
+ .config_init = macvlan_config_init,
|
||||||
|
+ .reload = macvlan_reload,
|
||||||
|
+diff --git a/system-linux.c b/system-linux.c
|
||||||
|
+index 351a994..794c1dd 100644
|
||||||
|
+--- a/system-linux.c
|
||||||
|
++++ b/system-linux.c
|
||||||
|
+@@ -464,7 +464,7 @@ static int cb_rtnl_event(struct nl_msg *msg, void *arg)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false);
|
||||||
|
+- if (!dev)
|
||||||
|
++ if (!dev || dev->type->keep_link_status)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ if (!system_get_dev_sysctl("/sys/class/net/%s/carrier", dev->ifname, buf, sizeof(buf)))
|
||||||
|
+diff --git a/vlan.c b/vlan.c
|
||||||
|
+index ac434ce..8d93799 100644
|
||||||
|
+--- a/vlan.c
|
||||||
|
++++ b/vlan.c
|
||||||
|
+@@ -79,6 +79,11 @@ static void vlan_dev_cb(struct device_user *dep, enum device_event ev)
|
||||||
|
+ case DEV_EVENT_REMOVE:
|
||||||
|
+ device_set_present(&vldev->dev, new_state);
|
||||||
|
+ break;
|
||||||
|
++ case DEV_EVENT_LINK_UP:
|
||||||
|
++ new_state = true;
|
||||||
|
++ case DEV_EVENT_LINK_DOWN:
|
||||||
|
++ device_set_link(&vldev->dev, new_state);
|
||||||
|
++ break;
|
||||||
|
+ case DEV_EVENT_UPDATE_IFNAME:
|
||||||
|
+ vlan_dev_set_name(vldev, dep->dev);
|
||||||
|
+ device_broadcast_event(&vldev->dev, ev);
|
||||||
|
+@@ -97,6 +102,7 @@ static struct device *get_vlan_device(struct device *dev, int id, bool create)
|
||||||
|
+ static const struct device_type vlan_type = {
|
||||||
|
+ .name = "VLAN",
|
||||||
|
+ .config_params = &device_attr_list,
|
||||||
|
++ .keep_link_status = true,
|
||||||
|
+ .free = free_vlan_if,
|
||||||
|
+ };
|
||||||
|
+ struct vlan_device *vldev;
|
||||||
|
+diff --git a/vlandev.c b/vlandev.c
|
||||||
|
+index b93527c..884e6ef 100644
|
||||||
|
+--- a/vlandev.c
|
||||||
|
++++ b/vlandev.c
|
||||||
|
+@@ -63,6 +63,12 @@ vlandev_base_cb(struct device_user *dev, enum device_event ev)
|
||||||
|
+ case DEV_EVENT_REMOVE:
|
||||||
|
+ device_set_present(&mvdev->dev, false);
|
||||||
|
+ break;
|
||||||
|
++ case DEV_EVENT_LINK_UP:
|
||||||
|
++ device_set_link(&mvdev->dev, true);
|
||||||
|
++ break;
|
||||||
|
++ case DEV_EVENT_LINK_DOWN:
|
||||||
|
++ device_set_link(&mvdev->dev, false);
|
||||||
|
++ break;
|
||||||
|
+ default:
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+@@ -243,6 +249,8 @@ vlandev_create(const char *name, struct blob_attr *attr)
|
||||||
|
+ const struct device_type vlandev_device_type = {
|
||||||
|
+ .name = "VLANDEV",
|
||||||
|
+ .config_params = &vlandev_attr_list,
|
||||||
|
++ .keep_link_status = true,
|
||||||
|
++
|
||||||
|
+ .create = vlandev_create,
|
||||||
|
+ .config_init = vlandev_config_init,
|
||||||
|
+ .reload = vlandev_reload,
|
||||||
|
+--
|
||||||
|
+2.8.2
|
||||||
|
+
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
From: Alexander Dahl <alex@netz39.de>
|
||||||
|
Date: Thu, 17 Mar 2016 15:04:09 +0100
|
||||||
|
Subject: x86: fix platform_export_bootpart() for Xen virtual disks
|
||||||
|
|
||||||
|
Virtual disk devices in a Xen virtual machine (DomU) can be /dev/xvda,
|
||||||
|
/dev/xvdb and so on with partitions like /dev/xdva1. Devices named like
|
||||||
|
this where not considered before. This resulted in a non working
|
||||||
|
sysupgrade, because the boot partition could not be found.
|
||||||
|
|
||||||
|
Signed-off-by: Alexander Dahl <alex@netz39.de>
|
||||||
|
Suggested-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
|
||||||
|
index 73ab5ef..adc119c 100644
|
||||||
|
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
|
||||||
|
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
|
||||||
|
@@ -17,7 +17,7 @@ platform_export_bootpart() {
|
||||||
|
PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
|
||||||
|
uuid="${disk#PARTUUID=}"
|
||||||
|
uuid="${uuid%-02}"
|
||||||
|
- for disk in /dev/[hsv]d[a-z]; do
|
||||||
|
+ for disk in /dev/[hsv]d[a-z] /dev/xvd[a-z]; do
|
||||||
|
set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
|
||||||
|
if [ "$4$3$2$1" = "$uuid" ]; then
|
||||||
|
export BOOTPART="${disk}1"
|
@ -0,0 +1,27 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Wed, 30 Mar 2016 02:59:19 +0200
|
||||||
|
Subject: Support LibreSSL as provider of openssl
|
||||||
|
|
||||||
|
The build scripts check for openssl by grepping the string "OpenSSL" in
|
||||||
|
the output of openssl version command. LibreSSL fails this test as it
|
||||||
|
outputs something like "LibreSSL 2.2.4". This patch fix the
|
||||||
|
prereq-bulid.mk file so that it accepts LibreSSL as openssl provider as
|
||||||
|
well.
|
||||||
|
|
||||||
|
Signed-off-by: Marek Behun <kabel@blackhole.sk>
|
||||||
|
|
||||||
|
Backport of r48267
|
||||||
|
|
||||||
|
diff --git a/include/prereq-build.mk b/include/prereq-build.mk
|
||||||
|
index 32c4ada..f36d57c 100644
|
||||||
|
--- a/include/prereq-build.mk
|
||||||
|
+++ b/include/prereq-build.mk
|
||||||
|
@@ -151,7 +151,7 @@ $(eval $(call SetupHostCommand,file,Please install the 'file' package, \
|
||||||
|
file --version 2>&1 | grep file))
|
||||||
|
|
||||||
|
$(eval $(call SetupHostCommand,openssl,Please install the 'openssl' utility, \
|
||||||
|
- openssl version | grep OpenSSL))
|
||||||
|
+ openssl version | grep '\(OpenSSL\|LibreSSL\)'))
|
||||||
|
|
||||||
|
|
||||||
|
# Install ldconfig stub
|
@ -0,0 +1,48 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 1 Apr 2016 23:16:13 +0200
|
||||||
|
Subject: ar71xx: check both HWID and HWREV on upgrades of TP-LINK devices
|
||||||
|
|
||||||
|
There's no reason for us to be more lenient than the stock firmware, so
|
||||||
|
better check the HWREV as well to avoid bricked devices.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
Backport of r49105
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
|
||||||
|
index d025632..c5c1871 100755
|
||||||
|
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
|
||||||
|
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
|
||||||
|
@@ -66,6 +66,10 @@ tplink_get_image_hwid() {
|
||||||
|
get_image "$@" | dd bs=4 count=1 skip=16 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
|
||||||
|
}
|
||||||
|
|
||||||
|
+tplink_get_image_mid() {
|
||||||
|
+ get_image "$@" | dd bs=4 count=1 skip=17 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
tplink_get_image_boot_size() {
|
||||||
|
get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
|
||||||
|
}
|
||||||
|
@@ -366,13 +370,17 @@ platform_check_image() {
|
||||||
|
}
|
||||||
|
|
||||||
|
local hwid
|
||||||
|
- local imageid
|
||||||
|
+ local mid
|
||||||
|
+ local imagehwid
|
||||||
|
+ local imagemid
|
||||||
|
|
||||||
|
hwid=$(tplink_get_hwid)
|
||||||
|
- imageid=$(tplink_get_image_hwid "$1")
|
||||||
|
+ mid=$(tplink_get_mid)
|
||||||
|
+ imagehwid=$(tplink_get_image_hwid "$1")
|
||||||
|
+ imagemid=$(tplink_get_image_mid "$1")
|
||||||
|
|
||||||
|
- [ "$hwid" != "$imageid" ] && {
|
||||||
|
- echo "Invalid image, hardware ID mismatch, hw:$hwid image:$imageid."
|
||||||
|
+ [ "$hwid" != "$imagehwid" -o "$mid" != "$imagemid" ] && {
|
||||||
|
+ echo "Invalid image, hardware ID mismatch, hw:$hwid $mid image:$imagehwid $imagemid."
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 1 Apr 2016 23:19:16 +0200
|
||||||
|
Subject: ar71xx: avoid AR71XX_MODEL ending with a space on some TP-LINK-like devices
|
||||||
|
|
||||||
|
Instead of adding the space when combining $model and $hwver, add the space
|
||||||
|
to the beginning of $hwver, so the resulting string won't end with a space
|
||||||
|
when $hwver is set to the empty string.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
Backport of r49106
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
index e7b3cd2..180a075 100755
|
||||||
|
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
@@ -133,7 +133,7 @@ tplink_board_detect() {
|
||||||
|
hwid=$(tplink_get_hwid)
|
||||||
|
mid=$(tplink_get_mid)
|
||||||
|
hwver=${hwid:6:2}
|
||||||
|
- hwver="v${hwver#0}"
|
||||||
|
+ hwver=" v${hwver#0}"
|
||||||
|
|
||||||
|
case "$hwid" in
|
||||||
|
"015000"*)
|
||||||
|
@@ -196,8 +196,8 @@ tplink_board_detect() {
|
||||||
|
"083000"*)
|
||||||
|
model="TP-Link TL-WA830RE"
|
||||||
|
|
||||||
|
- if [ "$hwver" = 'v10' ]; then
|
||||||
|
- hwver='v1'
|
||||||
|
+ if [ "$hwver" = ' v10' ]; then
|
||||||
|
+ hwver=' v1'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"084100"*)
|
||||||
|
@@ -296,7 +296,7 @@ tplink_board_detect() {
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
- AR71XX_MODEL="$model $hwver"
|
||||||
|
+ AR71XX_MODEL="$model$hwver"
|
||||||
|
}
|
||||||
|
|
||||||
|
tplink_pharos_get_model_string() {
|
@ -0,0 +1,39 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 1 Apr 2016 23:21:32 +0200
|
||||||
|
Subject: ar71xx: fix the revision of a few TP-LINK devices in AR71XX_MODEL to match labels/image names
|
||||||
|
|
||||||
|
Let's not confuse users about the revisions of their devices when we can
|
||||||
|
easily avoid it.
|
||||||
|
|
||||||
|
Not tested on real hardware.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
Backport of r49107
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
index 180a075..ddd6611 100755
|
||||||
|
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
|
||||||
|
@@ -162,6 +162,10 @@ tplink_board_detect() {
|
||||||
|
;;
|
||||||
|
"071000"*)
|
||||||
|
model="TP-Link TL-WR710N"
|
||||||
|
+
|
||||||
|
+ if [ "$hwid" = '07100002' -a "$mid" = '00000002' ]; then
|
||||||
|
+ hwver=' v2.1'
|
||||||
|
+ fi
|
||||||
|
;;
|
||||||
|
"072001"*)
|
||||||
|
model="TP-Link TL-WR720N"
|
||||||
|
@@ -202,6 +206,10 @@ tplink_board_detect() {
|
||||||
|
;;
|
||||||
|
"084100"*)
|
||||||
|
model="TP-Link TL-WR841N/ND"
|
||||||
|
+
|
||||||
|
+ if [ "$hwid" = '08410002' -a "$mid" = '00000002' ]; then
|
||||||
|
+ hwver=' v1.5'
|
||||||
|
+ fi
|
||||||
|
;;
|
||||||
|
"084200"*)
|
||||||
|
model="TP-Link TL-WR842N/ND"
|
@ -0,0 +1,41 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sat, 2 Apr 2016 00:56:50 +0200
|
||||||
|
Subject: ar71xx: build image for TL-WR710N v2.1
|
||||||
|
|
||||||
|
This patch just extends target/linux/ar71xx/image/Makefile to build
|
||||||
|
images also for version 2.1 of TL-WR710N
|
||||||
|
patch against the latest git
|
||||||
|
|
||||||
|
Signed off by: Norbert Wegener <nw@wegener-net.de>
|
||||||
|
|
||||||
|
Backport of r47849
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile
|
||||||
|
index 9a7acbd..d42ceef 100644
|
||||||
|
--- a/target/linux/ar71xx/image/Makefile
|
||||||
|
+++ b/target/linux/ar71xx/image/Makefile
|
||||||
|
@@ -476,6 +476,15 @@ define Device/tl-wr710n-v2
|
||||||
|
CONSOLE := ttyATH0,115200
|
||||||
|
endef
|
||||||
|
|
||||||
|
+define Device/tl-wr710n-v2.1
|
||||||
|
+ $(Device/tplink-8mlzma)
|
||||||
|
+ BOARDNAME := TL-WR710N
|
||||||
|
+ DEVICE_PROFILE := TLWR710
|
||||||
|
+ TPLINK_HWID := 0x07100002
|
||||||
|
+ TPLINK_HWREV := 0x00000002
|
||||||
|
+ CONSOLE := ttyATH0,115200
|
||||||
|
+endef
|
||||||
|
+
|
||||||
|
define Device/tl-wr720n-v3
|
||||||
|
$(Device/tplink-4mlzma)
|
||||||
|
BOARDNAME := TL-WR720N-v3
|
||||||
|
@@ -491,7 +500,7 @@ define Device/tl-wr720n-v4
|
||||||
|
TPLINK_HWID := 0x07200104
|
||||||
|
CONSOLE := ttyATH0,115200
|
||||||
|
endef
|
||||||
|
-TARGET_DEVICES += tl-wr703n-v1 tl-wr710n-v1 tl-wr710n-v2 tl-wr720n-v3 tl-wr720n-v4
|
||||||
|
+TARGET_DEVICES += tl-wr703n-v1 tl-wr710n-v1 tl-wr710n-v2 tl-wr710n-v2.1 tl-wr720n-v3 tl-wr720n-v4
|
||||||
|
|
||||||
|
define Device/tl-wr740n-v4
|
||||||
|
$(Device/tplink-4mlzma)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,81 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 24 Apr 2016 08:44:30 +0200
|
||||||
|
Subject: tools: add tar host build, required for --sort=name which was only added in the latest version
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
|
Backport of r46876
|
||||||
|
|
||||||
|
diff --git a/tools/Makefile b/tools/Makefile
|
||||||
|
index c6cded8..98ce8c5 100644
|
||||||
|
--- a/tools/Makefile
|
||||||
|
+++ b/tools/Makefile
|
||||||
|
@@ -81,6 +81,9 @@ endif
|
||||||
|
# dependency for tools which have patches directory
|
||||||
|
$(foreach tool, $(tools-y), $(if $(wildcard $(curdir)/$(tool)/patches),$(eval $(curdir)/$(tool)/compile += $(curdir)/patch/install)))
|
||||||
|
|
||||||
|
+$(foreach tool, $(tools-y), $(eval $(curdir)/$(tool)/compile += $(curdir)/tar/install))
|
||||||
|
+tools-y += tar
|
||||||
|
+
|
||||||
|
$(curdir)/builddirs := $(tools-y) $(tools-dep) $(tools-)
|
||||||
|
$(curdir)/builddirs-default := $(tools-y)
|
||||||
|
|
||||||
|
diff --git a/tools/tar/Makefile b/tools/tar/Makefile
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..975e783
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/tar/Makefile
|
||||||
|
@@ -0,0 +1,30 @@
|
||||||
|
+#
|
||||||
|
+# Copyright (C) 2015 OpenWrt.org
|
||||||
|
+#
|
||||||
|
+# This is free software, licensed under the GNU General Public License v2.
|
||||||
|
+# See /LICENSE for more information.
|
||||||
|
+#
|
||||||
|
+include $(TOPDIR)/rules.mk
|
||||||
|
+
|
||||||
|
+PKG_NAME:=tar
|
||||||
|
+PKG_VERSION:=1.28
|
||||||
|
+
|
||||||
|
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||||
|
+PKG_SOURCE_URL:=@GNU/tar
|
||||||
|
+PKG_MD5SUM:=49b6306167724fe48f419a33a5beb857
|
||||||
|
+
|
||||||
|
+HOST_BUILD_PARALLEL := 1
|
||||||
|
+
|
||||||
|
+include $(INCLUDE_DIR)/host-build.mk
|
||||||
|
+
|
||||||
|
+HOSTCC := $(HOSTCC_NOCACHE)
|
||||||
|
+HOSTCXX := $(HOSTCXX_NOCACHE)
|
||||||
|
+
|
||||||
|
+HOST_CONFIGURE_ARGS += \
|
||||||
|
+ --without-posix-acls \
|
||||||
|
+ --without-selinux \
|
||||||
|
+ --without-xattrs \
|
||||||
|
+ --disable-acl \
|
||||||
|
+ --disable-nls
|
||||||
|
+
|
||||||
|
+$(eval $(call HostBuild))
|
||||||
|
diff --git a/tools/tar/patches/100-fix_xattr_disable.patch b/tools/tar/patches/100-fix_xattr_disable.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..5735bd2
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/tar/patches/100-fix_xattr_disable.patch
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+--- a/lib/xattr-at.c
|
||||||
|
++++ b/lib/xattr-at.c
|
||||||
|
+@@ -18,6 +18,8 @@
|
||||||
|
+
|
||||||
|
+ #include <config.h>
|
||||||
|
+
|
||||||
|
++#ifdef HAVE_XATTRS
|
||||||
|
++
|
||||||
|
+ #include "xattr-at.h"
|
||||||
|
+ #include "openat.h"
|
||||||
|
+
|
||||||
|
+@@ -108,3 +110,5 @@
|
||||||
|
+ #undef AT_FUNC_RESULT
|
||||||
|
+ #undef AT_FUNC_POST_FILE_PARAM_DECLS
|
||||||
|
+ #undef AT_FUNC_POST_FILE_ARGS
|
||||||
|
++
|
||||||
|
++#endif
|
@ -0,0 +1,31 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 24 Apr 2016 08:44:47 +0200
|
||||||
|
Subject: tools: compile flock before everything else
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
|
Backport of r48413
|
||||||
|
|
||||||
|
diff --git a/tools/Makefile b/tools/Makefile
|
||||||
|
index 98ce8c5..3402c08 100644
|
||||||
|
--- a/tools/Makefile
|
||||||
|
+++ b/tools/Makefile
|
||||||
|
@@ -26,7 +26,7 @@ endif
|
||||||
|
tools-$(BUILD_TOOLCHAIN) += gmp mpfr mpc libelf
|
||||||
|
tools-y += m4 libtool autoconf automake flex bison pkg-config sed mklibs
|
||||||
|
tools-y += sstrip make-ext4fs e2fsprogs mtd-utils mkimage
|
||||||
|
-tools-y += firmware-utils patch-image patch quilt yaffs2 flock padjffs2
|
||||||
|
+tools-y += firmware-utils patch-image patch quilt yaffs2 padjffs2
|
||||||
|
tools-y += mm-macros missing-macros xz cmake scons bc findutils gengetopt patchelf
|
||||||
|
tools-$(CONFIG_TARGET_orion_generic) += wrt350nv2-builder upslug2
|
||||||
|
tools-$(CONFIG_powerpc) += upx
|
||||||
|
@@ -84,6 +84,9 @@ $(foreach tool, $(tools-y), $(if $(wildcard $(curdir)/$(tool)/patches),$(eval $(
|
||||||
|
$(foreach tool, $(tools-y), $(eval $(curdir)/$(tool)/compile += $(curdir)/tar/install))
|
||||||
|
tools-y += tar
|
||||||
|
|
||||||
|
+$(curdir)/tar/compile := $(curdir)/flock/install
|
||||||
|
+tools-y += flock
|
||||||
|
+
|
||||||
|
$(curdir)/builddirs := $(tools-y) $(tools-dep) $(tools-)
|
||||||
|
$(curdir)/builddirs-default := $(tools-y)
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 24 Apr 2016 08:45:44 +0200
|
||||||
|
Subject: rules.mk: make the locked template available even if flock has not been built yet (fall back to unlocked shell command)
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
|
Backport of r48414
|
||||||
|
|
||||||
|
diff --git a/rules.mk b/rules.mk
|
||||||
|
index 9d0134d..ece5026 100644
|
||||||
|
--- a/rules.mk
|
||||||
|
+++ b/rules.mk
|
||||||
|
@@ -310,12 +310,16 @@ endef
|
||||||
|
# Execute commands under flock
|
||||||
|
# $(1) => The shell expression.
|
||||||
|
# $(2) => The lock name. If not given, the global lock will be used.
|
||||||
|
-define locked
|
||||||
|
+ifneq ($(wildcard $(STAGING_DIR_HOST)/bin/flock),)
|
||||||
|
+ define locked
|
||||||
|
SHELL= \
|
||||||
|
- $(STAGING_DIR_HOST)/bin/flock \
|
||||||
|
+ flock \
|
||||||
|
$(TMP_DIR)/.$(if $(2),$(strip $(2)),global).flock \
|
||||||
|
-c '$(subst ','\'',$(1))'
|
||||||
|
-endef
|
||||||
|
+ endef
|
||||||
|
+else
|
||||||
|
+ locked=$(1)
|
||||||
|
+endif
|
||||||
|
|
||||||
|
# Recursively copy paths into another directory, purge dangling
|
||||||
|
# symlinks before.
|
@ -0,0 +1,20 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 24 Apr 2016 08:48:45 +0200
|
||||||
|
Subject: build: add locking for downloads (fixes race conditions with multiple variants)
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
|
Backport of r48416
|
||||||
|
|
||||||
|
diff --git a/include/download.mk b/include/download.mk
|
||||||
|
index e518cce..9176b11 100644
|
||||||
|
--- a/include/download.mk
|
||||||
|
+++ b/include/download.mk
|
||||||
|
@@ -182,6 +182,6 @@ define Download
|
||||||
|
|
||||||
|
$(DL_DIR)/$(FILE):
|
||||||
|
mkdir -p $(DL_DIR)
|
||||||
|
- $(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/unknown))
|
||||||
|
+ $(call locked,$(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/unknown)),$(FILE))
|
||||||
|
|
||||||
|
endef
|
@ -0,0 +1,26 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 24 Apr 2016 08:49:27 +0200
|
||||||
|
Subject: download.mk: fix packed checkout mirroring support
|
||||||
|
|
||||||
|
Changeset r48416 broke the downloading of mirrored, packed scm checkouts.
|
||||||
|
|
||||||
|
Fix this by removing the "@" sign in front of the download command which is
|
||||||
|
now executed as part of a larger shell command under flock.
|
||||||
|
|
||||||
|
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
|
||||||
|
|
||||||
|
Backport of r48733
|
||||||
|
|
||||||
|
diff --git a/include/download.mk b/include/download.mk
|
||||||
|
index 9176b11..130bbc5 100644
|
||||||
|
--- a/include/download.mk
|
||||||
|
+++ b/include/download.mk
|
||||||
|
@@ -48,7 +48,7 @@ define DownloadMethod/default
|
||||||
|
endef
|
||||||
|
|
||||||
|
define wrap_mirror
|
||||||
|
- $(if $(if $(MIRROR),$(filter-out x,$(MIRROR_MD5SUM))),@$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_MD5SUM)" "" || ( $(1) ),$(1))
|
||||||
|
+$(if $(if $(MIRROR),$(filter-out x,$(MIRROR_MD5SUM))),$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_MD5SUM)" "" || ( $(1) ),$(1))
|
||||||
|
endef
|
||||||
|
|
||||||
|
define DownloadMethod/cvs
|
2025
patches/openwrt/0030-kernel-backport-spi-nor-driver-from-4.4.9.patch
Normal file
2025
patches/openwrt/0030-kernel-backport-spi-nor-driver-from-4.4.9.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,115 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sat, 7 May 2016 00:17:55 +0200
|
||||||
|
Subject: kernel: mtd: spi-nor: wait until status register writes are ready
|
||||||
|
|
||||||
|
diff --git a/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch b/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..2c2e5f3
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch
|
||||||
|
@@ -0,0 +1,66 @@
|
||||||
|
+From 32321e950d8a237d7e8f3a9b76220007dfa87544 Mon Sep 17 00:00:00 2001
|
||||||
|
+Message-Id: <32321e950d8a237d7e8f3a9b76220007dfa87544.1462572686.git.mschiffer@universe-factory.net>
|
||||||
|
+From: =?UTF-8?q?Ezequiel=20Garc=C3=ADa?= <ezequiel@vanguardiasur.com.ar>
|
||||||
|
+Date: Mon, 28 Dec 2015 17:54:51 -0300
|
||||||
|
+Subject: [PATCH] mtd: spi-nor: wait until lock/unlock operations are ready
|
||||||
|
+
|
||||||
|
+On Micron and Numonyx devices, the status register write command
|
||||||
|
+(WRSR), raises a work-in-progress bit (WIP) on the status register.
|
||||||
|
+The datasheets for these devices specify that while the status
|
||||||
|
+register write is in progress, the status register WIP bit can still
|
||||||
|
+be read to check the end of the operation.
|
||||||
|
+
|
||||||
|
+This commit adds a wait_till_ready call on lock/unlock operations,
|
||||||
|
+which is required for Micron and Numonyx but should be harmless for
|
||||||
|
+others. This is needed to prevent applications from issuing erase or
|
||||||
|
+program operations before the unlock operation is completed.
|
||||||
|
+
|
||||||
|
+Reported-by: Stas Sergeev <stsp@list.ru>
|
||||||
|
+Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
|
||||||
|
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||||
|
+---
|
||||||
|
+ drivers/mtd/spi-nor/spi-nor.c | 12 ++++++++++--
|
||||||
|
+ 1 file changed, 10 insertions(+), 2 deletions(-)
|
||||||
|
+
|
||||||
|
+--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
++++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
+@@ -462,6 +462,7 @@ static int stm_lock(struct spi_nor *nor,
|
||||||
|
+ u8 status_old, status_new;
|
||||||
|
+ u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||||
|
+ u8 shift = ffs(mask) - 1, pow, val;
|
||||||
|
++ int ret;
|
||||||
|
+
|
||||||
|
+ status_old = read_sr(nor);
|
||||||
|
+
|
||||||
|
+@@ -498,7 +499,10 @@ static int stm_lock(struct spi_nor *nor,
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ write_enable(nor);
|
||||||
|
+- return write_sr(nor, status_new);
|
||||||
|
++ ret = write_sr(nor, status_new);
|
||||||
|
++ if (ret)
|
||||||
|
++ return ret;
|
||||||
|
++ return spi_nor_wait_till_ready(nor);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+@@ -512,6 +516,7 @@ static int stm_unlock(struct spi_nor *no
|
||||||
|
+ uint8_t status_old, status_new;
|
||||||
|
+ u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||||
|
+ u8 shift = ffs(mask) - 1, pow, val;
|
||||||
|
++ int ret;
|
||||||
|
+
|
||||||
|
+ status_old = read_sr(nor);
|
||||||
|
+
|
||||||
|
+@@ -546,7 +551,10 @@ static int stm_unlock(struct spi_nor *no
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ write_enable(nor);
|
||||||
|
+- return write_sr(nor, status_new);
|
||||||
|
++ ret = write_sr(nor, status_new);
|
||||||
|
++ if (ret)
|
||||||
|
++ return ret;
|
||||||
|
++ return spi_nor_wait_till_ready(nor);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
diff --git a/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch b/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a0573d5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch
|
||||||
|
@@ -0,0 +1,33 @@
|
||||||
|
+From edf891ef9ab773363f8e58022a26d7d31604aed6 Mon Sep 17 00:00:00 2001
|
||||||
|
+Message-Id: <edf891ef9ab773363f8e58022a26d7d31604aed6.1462572703.git.mschiffer@universe-factory.net>
|
||||||
|
+From: Brian Norris <computersforpeace@gmail.com>
|
||||||
|
+Date: Fri, 29 Jan 2016 11:25:30 -0800
|
||||||
|
+Subject: [PATCH] mtd: spi-nor: wait for SR_WIP to clear on initial unlock
|
||||||
|
+
|
||||||
|
+Fixup a piece leftover by commit 32321e950d8a ("mtd: spi-nor: wait until
|
||||||
|
+lock/unlock operations are ready"). That commit made us wait for the WIP
|
||||||
|
+bit to settle after lock/unlock operations, but it missed the open-coded
|
||||||
|
+"unlock" that happens at probe() time.
|
||||||
|
+
|
||||||
|
+We should probably have this code utilize the unlock() routines in the
|
||||||
|
+future, to avoid duplication, but unfortunately, flash which need to be
|
||||||
|
+unlocked don't all have a proper ->flash_unlock() callback.
|
||||||
|
+
|
||||||
|
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||||
|
+Cc: Stas Sergeev <stsp@users.sourceforge.net>
|
||||||
|
+Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
|
||||||
|
+Tested-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
|
||||||
|
+---
|
||||||
|
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
|
||||||
|
+ 1 file changed, 1 insertion(+)
|
||||||
|
+
|
||||||
|
+--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
++++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
+@@ -1167,6 +1167,7 @@ int spi_nor_scan(struct spi_nor *nor, co
|
||||||
|
+ JEDEC_MFR(info) == SNOR_MFR_SST) {
|
||||||
|
+ write_enable(nor);
|
||||||
|
+ write_sr(nor, 0);
|
||||||
|
++ spi_nor_wait_till_ready(nor);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!mtd->name)
|
@ -0,0 +1,56 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sat, 7 May 2016 00:29:06 +0200
|
||||||
|
Subject: kernel: mtd: spi-nor: unlock Winbond flashs
|
||||||
|
|
||||||
|
diff --git a/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch b/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..4682b7a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch
|
||||||
|
@@ -0,0 +1,46 @@
|
||||||
|
+From 20bbd73b6b04677a73933830363ab3178adc2ce9 Mon Sep 17 00:00:00 2001
|
||||||
|
+Message-Id: <20bbd73b6b04677a73933830363ab3178adc2ce9.1462573588.git.mschiffer@universe-factory.net>
|
||||||
|
+From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
+Date: Sat, 7 May 2016 00:26:23 +0200
|
||||||
|
+Subject: [PATCH] Revert "mtd: spi-nor: fix Spansion regressions (aliased with
|
||||||
|
+ Winbond)"
|
||||||
|
+
|
||||||
|
+This reverts commit 67b9bcd36906e12a15ffec19463afbbd6a41660e.
|
||||||
|
+---
|
||||||
|
+ drivers/mtd/spi-nor/spi-nor.c | 6 ++++--
|
||||||
|
+ include/linux/mtd/spi-nor.h | 2 +-
|
||||||
|
+ 2 files changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
+
|
||||||
|
+--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
++++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
+@@ -1165,7 +1165,8 @@ int spi_nor_scan(struct spi_nor *nor, co
|
||||||
|
+ if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
|
||||||
|
+ JEDEC_MFR(info) == SNOR_MFR_INTEL ||
|
||||||
|
+ JEDEC_MFR(info) == SNOR_MFR_MACRONIX ||
|
||||||
|
+- JEDEC_MFR(info) == SNOR_MFR_SST) {
|
||||||
|
++ JEDEC_MFR(info) == SNOR_MFR_SST ||
|
||||||
|
++ JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
|
||||||
|
+ write_enable(nor);
|
||||||
|
+ write_sr(nor, 0);
|
||||||
|
+ spi_nor_wait_till_ready(nor);
|
||||||
|
+@@ -1182,7 +1183,8 @@ int spi_nor_scan(struct spi_nor *nor, co
|
||||||
|
+ mtd->_read = spi_nor_read;
|
||||||
|
+
|
||||||
|
+ /* NOR protection support for STmicro/Micron chips and similar */
|
||||||
|
+- if (JEDEC_MFR(info) == SNOR_MFR_MICRON) {
|
||||||
|
++ if (JEDEC_MFR(info) == SNOR_MFR_MICRON ||
|
||||||
|
++ JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
|
||||||
|
+ nor->flash_lock = stm_lock;
|
||||||
|
+ nor->flash_unlock = stm_unlock;
|
||||||
|
+ nor->flash_is_locked = stm_is_locked;
|
||||||
|
+--- a/include/linux/mtd/spi-nor.h
|
||||||
|
++++ b/include/linux/mtd/spi-nor.h
|
||||||
|
+@@ -25,7 +25,7 @@
|
||||||
|
+ #define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX
|
||||||
|
+ #define SNOR_MFR_SPANSION CFI_MFR_AMD
|
||||||
|
+ #define SNOR_MFR_SST CFI_MFR_SST
|
||||||
|
+-#define SNOR_MFR_WINBOND 0xef /* Also used by some Spansion */
|
||||||
|
++#define SNOR_MFR_WINBOND 0xef
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Note on opcode nomenclature: some opcodes have a format like
|
@ -0,0 +1,37 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 8 May 2016 15:53:14 +0200
|
||||||
|
Subject: tools: pkg-config: fix build with GCC 6
|
||||||
|
|
||||||
|
Fixes the following error:
|
||||||
|
|
||||||
|
gdate.c: In function ‘g_date_strftime’:
|
||||||
|
gdate.c:2497:7: error: format not a string literal, format string not checked [-Werror=format-nonliteral]
|
||||||
|
tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
|
||||||
|
^~~~~~
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch b/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..6849299
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+--- a/glib/glib/gdate.c
|
||||||
|
++++ b/glib/glib/gdate.c
|
||||||
|
+@@ -2439,6 +2439,9 @@ win32_strftime_helper (const GDate *d,
|
||||||
|
+ *
|
||||||
|
+ * Returns: number of characters written to the buffer, or 0 the buffer was too small
|
||||||
|
+ */
|
||||||
|
++#pragma GCC diagnostic push
|
||||||
|
++#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||||
|
++
|
||||||
|
+ gsize
|
||||||
|
+ g_date_strftime (gchar *s,
|
||||||
|
+ gsize slen,
|
||||||
|
+@@ -2549,3 +2552,5 @@ g_date_strftime (gchar *s,
|
||||||
|
+ return retval;
|
||||||
|
+ #endif
|
||||||
|
+ }
|
||||||
|
++
|
||||||
|
++#pragma GCC diagnostic pop
|
@ -0,0 +1,815 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sun, 8 May 2016 22:06:51 +0200
|
||||||
|
Subject: tools: mkimage: sync include/linux/compiler*.h with u-boot master
|
||||||
|
|
||||||
|
Fixes build with GCC 6.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/tools/mkimage/patches/200-compiler-support.patch b/tools/mkimage/patches/200-compiler-support.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..ca9c5b5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/mkimage/patches/200-compiler-support.patch
|
||||||
|
@@ -0,0 +1,702 @@
|
||||||
|
+diff --git b/include/linux/compiler-gcc.h a/include/linux/compiler-gcc.h
|
||||||
|
+index e057bd2..22ab246 100644
|
||||||
|
+--- b/include/linux/compiler-gcc.h
|
||||||
|
++++ a/include/linux/compiler-gcc.h
|
||||||
|
+@@ -5,14 +5,28 @@
|
||||||
|
+ /*
|
||||||
|
+ * Common definitions for all gcc versions go here.
|
||||||
|
+ */
|
||||||
|
+-#define GCC_VERSION (__GNUC__ * 10000 \
|
||||||
|
+- + __GNUC_MINOR__ * 100 \
|
||||||
|
+- + __GNUC_PATCHLEVEL__)
|
||||||
|
+-
|
||||||
|
++#define GCC_VERSION (__GNUC__ * 10000 \
|
||||||
|
++ + __GNUC_MINOR__ * 100 \
|
||||||
|
++ + __GNUC_PATCHLEVEL__)
|
||||||
|
+
|
||||||
|
+ /* Optimization barrier */
|
||||||
|
++
|
||||||
|
+ /* The "volatile" is due to gcc bugs */
|
||||||
|
+ #define barrier() __asm__ __volatile__("": : :"memory")
|
||||||
|
++/*
|
||||||
|
++ * This version is i.e. to prevent dead stores elimination on @ptr
|
||||||
|
++ * where gcc and llvm may behave differently when otherwise using
|
||||||
|
++ * normal barrier(): while gcc behavior gets along with a normal
|
||||||
|
++ * barrier(), llvm needs an explicit input variable to be assumed
|
||||||
|
++ * clobbered. The issue is as follows: while the inline asm might
|
||||||
|
++ * access any memory it wants, the compiler could have fit all of
|
||||||
|
++ * @ptr into memory registers instead, and since @ptr never escaped
|
||||||
|
++ * from that, it proofed that the inline asm wasn't touching any of
|
||||||
|
++ * it. This version works well with both compilers, i.e. we're telling
|
||||||
|
++ * the compiler that the inline asm absolutely may see the contents
|
||||||
|
++ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
|
||||||
|
++ */
|
||||||
|
++#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * This macro obfuscates arithmetic on a variable address so that gcc
|
||||||
|
+@@ -32,58 +46,63 @@
|
||||||
|
+ * the inline assembly constraint from =g to =r, in this particular
|
||||||
|
+ * case either is valid.
|
||||||
|
+ */
|
||||||
|
+-#define RELOC_HIDE(ptr, off) \
|
||||||
|
+- ({ unsigned long __ptr; \
|
||||||
|
+- __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
|
||||||
|
+- (typeof(ptr)) (__ptr + (off)); })
|
||||||
|
++#define RELOC_HIDE(ptr, off) \
|
||||||
|
++({ \
|
||||||
|
++ unsigned long __ptr; \
|
||||||
|
++ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
|
||||||
|
++ (typeof(ptr)) (__ptr + (off)); \
|
||||||
|
++})
|
||||||
|
+
|
||||||
|
+ /* Make the optimizer believe the variable can be manipulated arbitrarily. */
|
||||||
|
+-#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var))
|
||||||
|
++#define OPTIMIZER_HIDE_VAR(var) \
|
||||||
|
++ __asm__ ("" : "=r" (var) : "0" (var))
|
||||||
|
+
|
||||||
|
+ #ifdef __CHECKER__
|
||||||
|
+-#define __must_be_array(arr) 0
|
||||||
|
++#define __must_be_array(a) 0
|
||||||
|
+ #else
|
||||||
|
+ /* &a[0] degrades to a pointer: a different type from an array */
|
||||||
|
+-#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||||
|
++#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Force always-inline if the user requests it so via the .config,
|
||||||
|
+ * or if gcc is too old:
|
||||||
|
+ */
|
||||||
|
+-#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||||
|
++#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||||
|
+ !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
|
||||||
|
+-# define inline inline __attribute__((always_inline)) notrace
|
||||||
|
+-# define __inline__ __inline__ __attribute__((always_inline)) notrace
|
||||||
|
+-# define __inline __inline __attribute__((always_inline)) notrace
|
||||||
|
++#define inline inline __attribute__((always_inline)) notrace
|
||||||
|
++#define __inline__ __inline__ __attribute__((always_inline)) notrace
|
||||||
|
++#define __inline __inline __attribute__((always_inline)) notrace
|
||||||
|
+ #else
|
||||||
|
+ /* A lot of inline functions can cause havoc with function tracing */
|
||||||
|
+-# define inline inline notrace
|
||||||
|
+-# define __inline__ __inline__ notrace
|
||||||
|
+-# define __inline __inline notrace
|
||||||
|
++#define inline inline notrace
|
||||||
|
++#define __inline__ __inline__ notrace
|
||||||
|
++#define __inline __inline notrace
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
+-#define __deprecated __attribute__((deprecated))
|
||||||
|
+-#ifndef __packed
|
||||||
|
+-#define __packed __attribute__((packed))
|
||||||
|
+-#endif
|
||||||
|
+-#ifndef __weak
|
||||||
|
+-#define __weak __attribute__((weak))
|
||||||
|
+-#endif
|
||||||
|
++#define __always_inline inline __attribute__((always_inline))
|
||||||
|
++#define noinline __attribute__((noinline))
|
||||||
|
++
|
||||||
|
++#define __deprecated __attribute__((deprecated))
|
||||||
|
++#define __packed __attribute__((packed))
|
||||||
|
++#define __weak __attribute__((weak))
|
||||||
|
++#define __alias(symbol) __attribute__((alias(#symbol)))
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+- * it doesn't make sense on ARM (currently the only user of __naked) to trace
|
||||||
|
+- * naked functions because then mcount is called without stack and frame pointer
|
||||||
|
+- * being set up and there is no chance to restore the lr register to the value
|
||||||
|
+- * before mcount was called.
|
||||||
|
++ * it doesn't make sense on ARM (currently the only user of __naked)
|
||||||
|
++ * to trace naked functions because then mcount is called without
|
||||||
|
++ * stack and frame pointer being set up and there is no chance to
|
||||||
|
++ * restore the lr register to the value before mcount was called.
|
||||||
|
++ *
|
||||||
|
++ * The asm() bodies of naked functions often depend on standard calling
|
||||||
|
++ * conventions, therefore they must be noinline and noclone.
|
||||||
|
+ *
|
||||||
|
+- * The asm() bodies of naked functions often depend on standard calling conventions,
|
||||||
|
+- * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce
|
||||||
|
+- * this, so we must do so ourselves. See GCC PR44290.
|
||||||
|
++ * GCC 4.[56] currently fail to enforce this, so we must do so ourselves.
|
||||||
|
++ * See GCC PR44290.
|
||||||
|
+ */
|
||||||
|
+-#define __naked __attribute__((naked)) noinline __noclone notrace
|
||||||
|
++#define __naked __attribute__((naked)) noinline __noclone notrace
|
||||||
|
+
|
||||||
|
+-#define __noreturn __attribute__((noreturn))
|
||||||
|
++#define __noreturn __attribute__((noreturn))
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * From the GCC manual:
|
||||||
|
+@@ -95,34 +114,170 @@
|
||||||
|
+ * would be.
|
||||||
|
+ * [...]
|
||||||
|
+ */
|
||||||
|
+-#ifndef __pure
|
||||||
|
+-#define __pure __attribute__((pure))
|
||||||
|
++#define __pure __attribute__((pure))
|
||||||
|
++#define __aligned(x) __attribute__((aligned(x)))
|
||||||
|
++#define __printf(a, b) __attribute__((format(printf, a, b)))
|
||||||
|
++#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
||||||
|
++#define __attribute_const__ __attribute__((__const__))
|
||||||
|
++#define __maybe_unused __attribute__((unused))
|
||||||
|
++#define __always_unused __attribute__((unused))
|
||||||
|
++
|
||||||
|
++/* gcc version specific checks */
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION < 30200
|
||||||
|
++# error Sorry, your compiler is too old - please upgrade it.
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION < 30300
|
||||||
|
++# define __used __attribute__((__unused__))
|
||||||
|
++#else
|
||||||
|
++# define __used __attribute__((__used__))
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#ifdef CONFIG_GCOV_KERNEL
|
||||||
|
++# if GCC_VERSION < 30400
|
||||||
|
++# error "GCOV profiling support for gcc versions below 3.4 not included"
|
||||||
|
++# endif /* __GNUC_MINOR__ */
|
||||||
|
++#endif /* CONFIG_GCOV_KERNEL */
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 30400
|
||||||
|
++#define __must_check __attribute__((warn_unused_result))
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40000
|
||||||
|
++
|
||||||
|
++/* GCC 4.1.[01] miscompiles __weak */
|
||||||
|
++#ifdef __KERNEL__
|
||||||
|
++# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
||||||
|
++# error Your version of gcc miscompiles the __weak directive
|
||||||
|
++# endif
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#define __used __attribute__((__used__))
|
||||||
|
++#define __compiler_offsetof(a, b) \
|
||||||
|
++ __builtin_offsetof(a, b)
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
|
||||||
|
++# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40300
|
||||||
|
++/* Mark functions as cold. gcc will assume any path leading to a call
|
||||||
|
++ * to them will be unlikely. This means a lot of manual unlikely()s
|
||||||
|
++ * are unnecessary now for any paths leading to the usual suspects
|
||||||
|
++ * like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||||
|
++ * older compilers]
|
||||||
|
++ *
|
||||||
|
++ * Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||||
|
++ * in the preprocessor, but we can live with this because they're unreleased.
|
||||||
|
++ * Maketime probing would be overkill here.
|
||||||
|
++ *
|
||||||
|
++ * gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||||
|
++ * a special section, but I don't see any sense in this right now in
|
||||||
|
++ * the kernel context
|
||||||
|
++ */
|
||||||
|
++#define __cold __attribute__((__cold__))
|
||||||
|
++
|
||||||
|
++#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||||
|
++
|
||||||
|
++#ifndef __CHECKER__
|
||||||
|
++# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||||
|
++# define __compiletime_error(message) __attribute__((error(message)))
|
||||||
|
++#endif /* __CHECKER__ */
|
||||||
|
++#endif /* GCC_VERSION >= 40300 */
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40500
|
||||||
|
++/*
|
||||||
|
++ * Mark a position in code as unreachable. This can be used to
|
||||||
|
++ * suppress control flow warnings after asm blocks that transfer
|
||||||
|
++ * control elsewhere.
|
||||||
|
++ *
|
||||||
|
++ * Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||||
|
++ * this in the preprocessor, but we can live with this because they're
|
||||||
|
++ * unreleased. Really, we need to have autoconf for the kernel.
|
||||||
|
++ */
|
||||||
|
++#define unreachable() __builtin_unreachable()
|
||||||
|
++
|
||||||
|
++/* Mark a function definition as prohibited from being cloned. */
|
||||||
|
++#define __noclone __attribute__((__noclone__))
|
||||||
|
++
|
||||||
|
++#endif /* GCC_VERSION >= 40500 */
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40600
|
||||||
|
++/*
|
||||||
|
++ * When used with Link Time Optimization, gcc can optimize away C functions or
|
||||||
|
++ * variables which are referenced only from assembly code. __visible tells the
|
||||||
|
++ * optimizer that something else uses this function or variable, thus preventing
|
||||||
|
++ * this.
|
||||||
|
++ */
|
||||||
|
++#define __visible __attribute__((externally_visible))
|
||||||
|
+ #endif
|
||||||
|
+-#ifndef __aligned
|
||||||
|
+-#define __aligned(x) __attribute__((aligned(x)))
|
||||||
|
++
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
||||||
|
++/*
|
||||||
|
++ * __assume_aligned(n, k): Tell the optimizer that the returned
|
||||||
|
++ * pointer can be assumed to be k modulo n. The second argument is
|
||||||
|
++ * optional (default 0), so we use a variadic macro to make the
|
||||||
|
++ * shorthand.
|
||||||
|
++ *
|
||||||
|
++ * Beware: Do not apply this to functions which may return
|
||||||
|
++ * ERR_PTRs. Also, it is probably unwise to apply it to functions
|
||||||
|
++ * returning extra information in the low bits (but in that case the
|
||||||
|
++ * compiler should see some alignment anyway, when the return value is
|
||||||
|
++ * massaged by 'flags = ptr & 3; ptr &= ~3;').
|
||||||
|
++ */
|
||||||
|
++#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||||
|
+ #endif
|
||||||
|
+-#define __printf(a, b) __attribute__((format(printf, a, b)))
|
||||||
|
+-#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
||||||
|
+-#define noinline __attribute__((noinline))
|
||||||
|
+-#define __attribute_const__ __attribute__((__const__))
|
||||||
|
+-#define __maybe_unused __attribute__((unused))
|
||||||
|
+-#define __always_unused __attribute__((unused))
|
||||||
|
+
|
||||||
|
+-#define __gcc_header(x) #x
|
||||||
|
+-#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
|
||||||
|
+-#define gcc_header(x) _gcc_header(x)
|
||||||
|
+-#include gcc_header(__GNUC__)
|
||||||
|
++/*
|
||||||
|
++ * GCC 'asm goto' miscompiles certain code sequences:
|
||||||
|
++ *
|
||||||
|
++ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||||
|
++ *
|
||||||
|
++ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||||
|
++ *
|
||||||
|
++ * (asm goto is automatically volatile - the naming reflects this.)
|
||||||
|
++ */
|
||||||
|
++#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||||
|
++
|
||||||
|
++#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||||
|
++#if GCC_VERSION >= 40400
|
||||||
|
++#define __HAVE_BUILTIN_BSWAP32__
|
||||||
|
++#define __HAVE_BUILTIN_BSWAP64__
|
||||||
|
++#endif
|
||||||
|
++#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
|
||||||
|
++#define __HAVE_BUILTIN_BSWAP16__
|
||||||
|
++#endif
|
||||||
|
++#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 50000
|
||||||
|
++#define KASAN_ABI_VERSION 4
|
||||||
|
++#elif GCC_VERSION >= 40902
|
||||||
|
++#define KASAN_ABI_VERSION 3
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#if GCC_VERSION >= 40902
|
||||||
|
++/*
|
||||||
|
++ * Tell the compiler that address safety instrumentation (KASAN)
|
||||||
|
++ * should not be applied to that function.
|
||||||
|
++ * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||||
|
++ */
|
||||||
|
++#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++#endif /* gcc version >= 40000 specific checks */
|
||||||
|
+
|
||||||
|
+ #if !defined(__noclone)
|
||||||
|
+ #define __noclone /* not needed */
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
++#if !defined(__no_sanitize_address)
|
||||||
|
++#define __no_sanitize_address
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
+ /*
|
||||||
|
+ * A trick to suppress uninitialized variable warning without generating any
|
||||||
|
+ * code
|
||||||
|
+ */
|
||||||
|
+ #define uninitialized_var(x) x = x
|
||||||
|
+-
|
||||||
|
+-#ifndef __always_inline
|
||||||
|
+-#define __always_inline inline __attribute__((always_inline))
|
||||||
|
+-#endif
|
||||||
|
+diff --git b/include/linux/compiler-gcc3.h a/include/linux/compiler-gcc3.h
|
||||||
|
+deleted file mode 100644
|
||||||
|
+index 7d89feb..0000000
|
||||||
|
+--- b/include/linux/compiler-gcc3.h
|
||||||
|
++++ /dev/null
|
||||||
|
+@@ -1,23 +0,0 @@
|
||||||
|
+-#ifndef __LINUX_COMPILER_H
|
||||||
|
+-#error "Please don't include <linux/compiler-gcc3.h> directly, include <linux/compiler.h> instead."
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION < 30200
|
||||||
|
+-# error Sorry, your compiler is too old - please upgrade it.
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 30300
|
||||||
|
+-# define __used __attribute__((__used__))
|
||||||
|
+-#else
|
||||||
|
+-# define __used __attribute__((__unused__))
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 30400
|
||||||
|
+-#define __must_check __attribute__((warn_unused_result))
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#ifdef CONFIG_GCOV_KERNEL
|
||||||
|
+-# if GCC_VERSION < 30400
|
||||||
|
+-# error "GCOV profiling support for gcc versions below 3.4 not included"
|
||||||
|
+-# endif /* __GNUC_MINOR__ */
|
||||||
|
+-#endif /* CONFIG_GCOV_KERNEL */
|
||||||
|
+diff --git b/include/linux/compiler-gcc4.h a/include/linux/compiler-gcc4.h
|
||||||
|
+deleted file mode 100644
|
||||||
|
+index c982a09..0000000
|
||||||
|
+--- b/include/linux/compiler-gcc4.h
|
||||||
|
++++ /dev/null
|
||||||
|
+@@ -1,81 +0,0 @@
|
||||||
|
+-#ifndef __LINUX_COMPILER_H
|
||||||
|
+-#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#define __used __attribute__((__used__))
|
||||||
|
+-#define __must_check __attribute__((warn_unused_result))
|
||||||
|
+-#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
|
||||||
|
+-# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 40300
|
||||||
|
+-/* Mark functions as cold. gcc will assume any path leading to a call
|
||||||
|
+- to them will be unlikely. This means a lot of manual unlikely()s
|
||||||
|
+- are unnecessary now for any paths leading to the usual suspects
|
||||||
|
+- like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||||
|
+- older compilers]
|
||||||
|
+-
|
||||||
|
+- Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||||
|
+- in the preprocessor, but we can live with this because they're unreleased.
|
||||||
|
+- Maketime probing would be overkill here.
|
||||||
|
+-
|
||||||
|
+- gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||||
|
+- a special section, but I don't see any sense in this right now in
|
||||||
|
+- the kernel context */
|
||||||
|
+-#define __cold __attribute__((__cold__))
|
||||||
|
+-
|
||||||
|
+-#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||||
|
+-
|
||||||
|
+-#ifndef __CHECKER__
|
||||||
|
+-# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||||
|
+-# define __compiletime_error(message) __attribute__((error(message)))
|
||||||
|
+-#endif /* __CHECKER__ */
|
||||||
|
+-#endif /* GCC_VERSION >= 40300 */
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 40500
|
||||||
|
+-/*
|
||||||
|
+- * Mark a position in code as unreachable. This can be used to
|
||||||
|
+- * suppress control flow warnings after asm blocks that transfer
|
||||||
|
+- * control elsewhere.
|
||||||
|
+- *
|
||||||
|
+- * Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||||
|
+- * this in the preprocessor, but we can live with this because they're
|
||||||
|
+- * unreleased. Really, we need to have autoconf for the kernel.
|
||||||
|
+- */
|
||||||
|
+-#define unreachable() __builtin_unreachable()
|
||||||
|
+-
|
||||||
|
+-/* Mark a function definition as prohibited from being cloned. */
|
||||||
|
+-#define __noclone __attribute__((__noclone__))
|
||||||
|
+-
|
||||||
|
+-#endif /* GCC_VERSION >= 40500 */
|
||||||
|
+-
|
||||||
|
+-#if GCC_VERSION >= 40600
|
||||||
|
+-/*
|
||||||
|
+- * Tell the optimizer that something else uses this function or variable.
|
||||||
|
+- */
|
||||||
|
+-#define __visible __attribute__((externally_visible))
|
||||||
|
+-#endif
|
||||||
|
+-
|
||||||
|
+-/*
|
||||||
|
+- * GCC 'asm goto' miscompiles certain code sequences:
|
||||||
|
+- *
|
||||||
|
+- * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||||
|
+- *
|
||||||
|
+- * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||||
|
+- * Fixed in GCC 4.8.2 and later versions.
|
||||||
|
+- *
|
||||||
|
+- * (asm goto is automatically volatile - the naming reflects this.)
|
||||||
|
+- */
|
||||||
|
+-#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||||
|
+-
|
||||||
|
+-#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||||
|
+-#if GCC_VERSION >= 40400
|
||||||
|
+-#define __HAVE_BUILTIN_BSWAP32__
|
||||||
|
+-#define __HAVE_BUILTIN_BSWAP64__
|
||||||
|
+-#endif
|
||||||
|
+-#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
|
||||||
|
+-#define __HAVE_BUILTIN_BSWAP16__
|
||||||
|
+-#endif
|
||||||
|
+-#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||||
|
+diff --git b/include/linux/compiler-intel.h a/include/linux/compiler-intel.h
|
||||||
|
+index ba147a1..d4c7113 100644
|
||||||
|
+--- b/include/linux/compiler-intel.h
|
||||||
|
++++ a/include/linux/compiler-intel.h
|
||||||
|
+@@ -13,9 +13,14 @@
|
||||||
|
+ /* Intel ECC compiler doesn't support gcc specific asm stmts.
|
||||||
|
+ * It uses intrinsics to do the equivalent things.
|
||||||
|
+ */
|
||||||
|
++#undef barrier
|
||||||
|
++#undef barrier_data
|
||||||
|
+ #undef RELOC_HIDE
|
||||||
|
+ #undef OPTIMIZER_HIDE_VAR
|
||||||
|
+
|
||||||
|
++#define barrier() __memory_barrier()
|
||||||
|
++#define barrier_data(ptr) barrier()
|
||||||
|
++
|
||||||
|
+ #define RELOC_HIDE(ptr, off) \
|
||||||
|
+ ({ unsigned long __ptr; \
|
||||||
|
+ __ptr = (unsigned long) (ptr); \
|
||||||
|
+diff --git b/include/linux/compiler.h a/include/linux/compiler.h
|
||||||
|
+index d5ad7b1..020ad16 100644
|
||||||
|
+--- b/include/linux/compiler.h
|
||||||
|
++++ a/include/linux/compiler.h
|
||||||
|
+@@ -17,6 +17,7 @@
|
||||||
|
+ # define __release(x) __context__(x,-1)
|
||||||
|
+ # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)
|
||||||
|
+ # define __percpu __attribute__((noderef, address_space(3)))
|
||||||
|
++# define __pmem __attribute__((noderef, address_space(5)))
|
||||||
|
+ #ifdef CONFIG_SPARSE_RCU_POINTER
|
||||||
|
+ # define __rcu __attribute__((noderef, address_space(4)))
|
||||||
|
+ #else
|
||||||
|
+@@ -42,6 +43,7 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
||||||
|
+ # define __cond_lock(x,c) (c)
|
||||||
|
+ # define __percpu
|
||||||
|
+ # define __rcu
|
||||||
|
++# define __pmem
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
+ /* Indirect macros required for expanded argument pasting, eg. __LINE__. */
|
||||||
|
+@@ -54,7 +56,11 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
||||||
|
+ #include <linux/compiler-gcc.h>
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
++#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
|
||||||
|
++#define notrace __attribute__((hotpatch(0,0)))
|
||||||
|
++#else
|
||||||
|
+ #define notrace __attribute__((no_instrument_function))
|
||||||
|
++#endif
|
||||||
|
+
|
||||||
|
+ /* Intel compiler defines __GNUC__. So we will overwrite implementations
|
||||||
|
+ * coming from above header files here
|
||||||
|
+@@ -138,7 +144,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+ */
|
||||||
|
+ #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
|
||||||
|
+ #define __trace_if(cond) \
|
||||||
|
+- if (__builtin_constant_p((cond)) ? !!(cond) : \
|
||||||
|
++ if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
|
||||||
|
+ ({ \
|
||||||
|
+ int ______r; \
|
||||||
|
+ static struct ftrace_branch_data \
|
||||||
|
+@@ -165,6 +171,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+ # define barrier() __memory_barrier()
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
++#ifndef barrier_data
|
||||||
|
++# define barrier_data(ptr) barrier()
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
+ /* Unreachable code */
|
||||||
|
+ #ifndef unreachable
|
||||||
|
+ # define unreachable() do { } while (1)
|
||||||
|
+@@ -186,6 +196,126 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+ # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__)
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
++#include <linux/types.h>
|
||||||
|
++
|
||||||
|
++#define __READ_ONCE_SIZE \
|
||||||
|
++({ \
|
||||||
|
++ switch (size) { \
|
||||||
|
++ case 1: *(__u8 *)res = *(volatile __u8 *)p; break; \
|
||||||
|
++ case 2: *(__u16 *)res = *(volatile __u16 *)p; break; \
|
||||||
|
++ case 4: *(__u32 *)res = *(volatile __u32 *)p; break; \
|
||||||
|
++ case 8: *(__u64 *)res = *(volatile __u64 *)p; break; \
|
||||||
|
++ default: \
|
||||||
|
++ barrier(); \
|
||||||
|
++ __builtin_memcpy((void *)res, (const void *)p, size); \
|
||||||
|
++ barrier(); \
|
||||||
|
++ } \
|
||||||
|
++})
|
||||||
|
++
|
||||||
|
++static __always_inline
|
||||||
|
++void __read_once_size(const volatile void *p, void *res, int size)
|
||||||
|
++{
|
||||||
|
++ __READ_ONCE_SIZE;
|
||||||
|
++}
|
||||||
|
++
|
||||||
|
++#ifdef CONFIG_KASAN
|
||||||
|
++/*
|
||||||
|
++ * This function is not 'inline' because __no_sanitize_address confilcts
|
||||||
|
++ * with inlining. Attempt to inline it may cause a build failure.
|
||||||
|
++ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||||
|
++ * '__maybe_unused' allows us to avoid defined-but-not-used warnings.
|
||||||
|
++ */
|
||||||
|
++static __no_sanitize_address __maybe_unused
|
||||||
|
++void __read_once_size_nocheck(const volatile void *p, void *res, int size)
|
||||||
|
++{
|
||||||
|
++ __READ_ONCE_SIZE;
|
||||||
|
++}
|
||||||
|
++#else
|
||||||
|
++static __always_inline
|
||||||
|
++void __read_once_size_nocheck(const volatile void *p, void *res, int size)
|
||||||
|
++{
|
||||||
|
++ __READ_ONCE_SIZE;
|
||||||
|
++}
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++static __always_inline void __write_once_size(volatile void *p, void *res, int size)
|
||||||
|
++{
|
||||||
|
++ switch (size) {
|
||||||
|
++ case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
|
||||||
|
++ case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
|
||||||
|
++ case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
|
||||||
|
++ case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
|
||||||
|
++ default:
|
||||||
|
++ barrier();
|
||||||
|
++ __builtin_memcpy((void *)p, (const void *)res, size);
|
||||||
|
++ barrier();
|
||||||
|
++ }
|
||||||
|
++}
|
||||||
|
++
|
||||||
|
++/*
|
||||||
|
++ * Prevent the compiler from merging or refetching reads or writes. The
|
||||||
|
++ * compiler is also forbidden from reordering successive instances of
|
||||||
|
++ * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the
|
||||||
|
++ * compiler is aware of some particular ordering. One way to make the
|
||||||
|
++ * compiler aware of ordering is to put the two invocations of READ_ONCE,
|
||||||
|
++ * WRITE_ONCE or ACCESS_ONCE() in different C statements.
|
||||||
|
++ *
|
||||||
|
++ * In contrast to ACCESS_ONCE these two macros will also work on aggregate
|
||||||
|
++ * data types like structs or unions. If the size of the accessed data
|
||||||
|
++ * type exceeds the word size of the machine (e.g., 32 bits or 64 bits)
|
||||||
|
++ * READ_ONCE() and WRITE_ONCE() will fall back to memcpy and print a
|
||||||
|
++ * compile-time warning.
|
||||||
|
++ *
|
||||||
|
++ * Their two major use cases are: (1) Mediating communication between
|
||||||
|
++ * process-level code and irq/NMI handlers, all running on the same CPU,
|
||||||
|
++ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise
|
||||||
|
++ * mutilate accesses that either do not require ordering or that interact
|
||||||
|
++ * with an explicit memory barrier or atomic instruction that provides the
|
||||||
|
++ * required ordering.
|
||||||
|
++ */
|
||||||
|
++
|
||||||
|
++#define __READ_ONCE(x, check) \
|
||||||
|
++({ \
|
||||||
|
++ union { typeof(x) __val; char __c[1]; } __u; \
|
||||||
|
++ if (check) \
|
||||||
|
++ __read_once_size(&(x), __u.__c, sizeof(x)); \
|
||||||
|
++ else \
|
||||||
|
++ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \
|
||||||
|
++ __u.__val; \
|
||||||
|
++})
|
||||||
|
++#define READ_ONCE(x) __READ_ONCE(x, 1)
|
||||||
|
++
|
||||||
|
++/*
|
||||||
|
++ * Use READ_ONCE_NOCHECK() instead of READ_ONCE() if you need
|
||||||
|
++ * to hide memory access from KASAN.
|
||||||
|
++ */
|
||||||
|
++#define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0)
|
||||||
|
++
|
||||||
|
++#define WRITE_ONCE(x, val) \
|
||||||
|
++({ \
|
||||||
|
++ union { typeof(x) __val; char __c[1]; } __u = \
|
||||||
|
++ { .__val = (__force typeof(x)) (val) }; \
|
||||||
|
++ __write_once_size(&(x), __u.__c, sizeof(x)); \
|
||||||
|
++ __u.__val; \
|
||||||
|
++})
|
||||||
|
++
|
||||||
|
++/**
|
||||||
|
++ * smp_cond_acquire() - Spin wait for cond with ACQUIRE ordering
|
||||||
|
++ * @cond: boolean expression to wait for
|
||||||
|
++ *
|
||||||
|
++ * Equivalent to using smp_load_acquire() on the condition variable but employs
|
||||||
|
++ * the control dependency of the wait to reduce the barrier on many platforms.
|
||||||
|
++ *
|
||||||
|
++ * The control dependency provides a LOAD->STORE order, the additional RMB
|
||||||
|
++ * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order,
|
||||||
|
++ * aka. ACQUIRE.
|
||||||
|
++ */
|
||||||
|
++#define smp_cond_acquire(cond) do { \
|
||||||
|
++ while (!(cond)) \
|
||||||
|
++ cpu_relax(); \
|
||||||
|
++ smp_rmb(); /* ctrl + rmb := acquire */ \
|
||||||
|
++} while (0)
|
||||||
|
++
|
||||||
|
+ #endif /* __KERNEL__ */
|
||||||
|
+
|
||||||
|
+ #endif /* __ASSEMBLY__ */
|
||||||
|
+@@ -304,6 +434,14 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+ #define __visible
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
++/*
|
||||||
|
++ * Assume alignment of return value.
|
||||||
|
++ */
|
||||||
|
++#ifndef __assume_aligned
|
||||||
|
++#define __assume_aligned(a, ...)
|
||||||
|
++#endif
|
||||||
|
++
|
||||||
|
++
|
||||||
|
+ /* Are two types/vars the same type (ignoring qualifiers)? */
|
||||||
|
+ #ifndef __same_type
|
||||||
|
+ # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||||
|
+@@ -311,7 +449,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+
|
||||||
|
+ /* Is this type a native word size -- useful for atomic operations */
|
||||||
|
+ #ifndef __native_word
|
||||||
|
+-# define __native_word(t) (sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
||||||
|
++# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
+ /* Compile time object size, -1 for unknown */
|
||||||
|
+@@ -373,12 +511,38 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
|
+ * to make the compiler aware of ordering is to put the two invocations of
|
||||||
|
+ * ACCESS_ONCE() in different C statements.
|
||||||
|
+ *
|
||||||
|
+- * This macro does absolutely -nothing- to prevent the CPU from reordering,
|
||||||
|
+- * merging, or refetching absolutely anything at any time. Its main intended
|
||||||
|
+- * use is to mediate communication between process-level code and irq/NMI
|
||||||
|
+- * handlers, all running on the same CPU.
|
||||||
|
++ * ACCESS_ONCE will only work on scalar types. For union types, ACCESS_ONCE
|
||||||
|
++ * on a union member will work as long as the size of the member matches the
|
||||||
|
++ * size of the union and the size is smaller than word size.
|
||||||
|
++ *
|
||||||
|
++ * The major use cases of ACCESS_ONCE used to be (1) Mediating communication
|
||||||
|
++ * between process-level code and irq/NMI handlers, all running on the same CPU,
|
||||||
|
++ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise
|
||||||
|
++ * mutilate accesses that either do not require ordering or that interact
|
||||||
|
++ * with an explicit memory barrier or atomic instruction that provides the
|
||||||
|
++ * required ordering.
|
||||||
|
++ *
|
||||||
|
++ * If possible use READ_ONCE()/WRITE_ONCE() instead.
|
||||||
|
++ */
|
||||||
|
++#define __ACCESS_ONCE(x) ({ \
|
||||||
|
++ __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \
|
||||||
|
++ (volatile typeof(x) *)&(x); })
|
||||||
|
++#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x))
|
||||||
|
++
|
||||||
|
++/**
|
||||||
|
++ * lockless_dereference() - safely load a pointer for later dereference
|
||||||
|
++ * @p: The pointer to load
|
||||||
|
++ *
|
||||||
|
++ * Similar to rcu_dereference(), but for situations where the pointed-to
|
||||||
|
++ * object's lifetime is managed by something other than RCU. That
|
||||||
|
++ * "something other" might be reference counting or simple immortality.
|
||||||
|
+ */
|
||||||
|
+-#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
|
||||||
|
++#define lockless_dereference(p) \
|
||||||
|
++({ \
|
||||||
|
++ typeof(p) _________p1 = READ_ONCE(p); \
|
||||||
|
++ smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
|
||||||
|
++ (_________p1); \
|
||||||
|
++})
|
||||||
|
+
|
||||||
|
+ /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */
|
||||||
|
+ #ifdef CONFIG_KPROBES
|
||||||
|
diff --git a/tools/mkimage/patches/200-gcc5_compat.patch b/tools/mkimage/patches/200-gcc5_compat.patch
|
||||||
|
deleted file mode 100644
|
||||||
|
index 4d55f00..0000000
|
||||||
|
--- a/tools/mkimage/patches/200-gcc5_compat.patch
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,93 +0,0 @@
|
||||||
|
-From 478b02f1a7043b673565075ea5016376f3293b23 Mon Sep 17 00:00:00 2001
|
||||||
|
-From: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
-Date: Sat, 7 Feb 2015 22:52:40 +0100
|
||||||
|
-Subject: [PATCH] Add linux/compiler-gcc5.h to fix builds with gcc5
|
||||||
|
-
|
||||||
|
-Add linux/compiler-gcc5/h from the kernel sources at:
|
||||||
|
-
|
||||||
|
-commit 5631b8fba640a4ab2f8a954f63a603fa34eda96b
|
||||||
|
-Author: Steven Noonan <steven@uplinklabs.net>
|
||||||
|
-Date: Sat Oct 25 15:09:42 2014 -0700
|
||||||
|
-
|
||||||
|
- compiler/gcc4+: Remove inaccurate comment about 'asm goto' miscompiles
|
||||||
|
-
|
||||||
|
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
----
|
||||||
|
- include/linux/compiler-gcc5.h | 65 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- 1 file changed, 65 insertions(+)
|
||||||
|
- create mode 100644 include/linux/compiler-gcc5.h
|
||||||
|
-
|
||||||
|
-diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h
|
||||||
|
-new file mode 100644
|
||||||
|
-index 0000000..c8c5659
|
||||||
|
---- /dev/null
|
||||||
|
-+++ b/include/linux/compiler-gcc5.h
|
||||||
|
-@@ -0,0 +1,65 @@
|
||||||
|
-+#ifndef __LINUX_COMPILER_H
|
||||||
|
-+#error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead."
|
||||||
|
-+#endif
|
||||||
|
-+
|
||||||
|
-+#define __used __attribute__((__used__))
|
||||||
|
-+#define __must_check __attribute__((warn_unused_result))
|
||||||
|
-+#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||||
|
-+
|
||||||
|
-+/* Mark functions as cold. gcc will assume any path leading to a call
|
||||||
|
-+ to them will be unlikely. This means a lot of manual unlikely()s
|
||||||
|
-+ are unnecessary now for any paths leading to the usual suspects
|
||||||
|
-+ like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||||
|
-+ older compilers]
|
||||||
|
-+
|
||||||
|
-+ Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||||
|
-+ in the preprocessor, but we can live with this because they're unreleased.
|
||||||
|
-+ Maketime probing would be overkill here.
|
||||||
|
-+
|
||||||
|
-+ gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||||
|
-+ a special section, but I don't see any sense in this right now in
|
||||||
|
-+ the kernel context */
|
||||||
|
-+#define __cold __attribute__((__cold__))
|
||||||
|
-+
|
||||||
|
-+#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||||
|
-+
|
||||||
|
-+#ifndef __CHECKER__
|
||||||
|
-+# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||||
|
-+# define __compiletime_error(message) __attribute__((error(message)))
|
||||||
|
-+#endif /* __CHECKER__ */
|
||||||
|
-+
|
||||||
|
-+/*
|
||||||
|
-+ * Mark a position in code as unreachable. This can be used to
|
||||||
|
-+ * suppress control flow warnings after asm blocks that transfer
|
||||||
|
-+ * control elsewhere.
|
||||||
|
-+ *
|
||||||
|
-+ * Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||||
|
-+ * this in the preprocessor, but we can live with this because they're
|
||||||
|
-+ * unreleased. Really, we need to have autoconf for the kernel.
|
||||||
|
-+ */
|
||||||
|
-+#define unreachable() __builtin_unreachable()
|
||||||
|
-+
|
||||||
|
-+/* Mark a function definition as prohibited from being cloned. */
|
||||||
|
-+#define __noclone __attribute__((__noclone__))
|
||||||
|
-+
|
||||||
|
-+/*
|
||||||
|
-+ * Tell the optimizer that something else uses this function or variable.
|
||||||
|
-+ */
|
||||||
|
-+#define __visible __attribute__((externally_visible))
|
||||||
|
-+
|
||||||
|
-+/*
|
||||||
|
-+ * GCC 'asm goto' miscompiles certain code sequences:
|
||||||
|
-+ *
|
||||||
|
-+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||||
|
-+ *
|
||||||
|
-+ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||||
|
-+ *
|
||||||
|
-+ * (asm goto is automatically volatile - the naming reflects this.)
|
||||||
|
-+ */
|
||||||
|
-+#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||||
|
-+
|
||||||
|
-+#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||||
|
-+#define __HAVE_BUILTIN_BSWAP32__
|
||||||
|
-+#define __HAVE_BUILTIN_BSWAP64__
|
||||||
|
-+#define __HAVE_BUILTIN_BSWAP16__
|
||||||
|
-+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||||
|
---
|
||||||
|
-1.7.10.4
|
||||||
|
-
|
144
patches/openwrt/0035-toolchain-gcc-fix-build-with-GCC-6.patch
Normal file
144
patches/openwrt/0035-toolchain-gcc-fix-build-with-GCC-6.patch
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Mon, 9 May 2016 00:16:38 +0200
|
||||||
|
Subject: toolchain: gcc: fix build with GCC 6
|
||||||
|
|
||||||
|
At least for GCC 4.8, which is used by most targets.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch b/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..c74f2aa
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch
|
||||||
|
@@ -0,0 +1,130 @@
|
||||||
|
+Upstream commit r233721
|
||||||
|
+
|
||||||
|
+diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
|
||||||
|
+index bd1c1d7..a0ea0d4 100644
|
||||||
|
+--- a/gcc/cp/Make-lang.in
|
||||||
|
++++ b/gcc/cp/Make-lang.in
|
||||||
|
+@@ -111,7 +111,7 @@ else
|
||||||
|
+ # deleting the $(srcdir)/cp/cfns.h file.
|
||||||
|
+ $(srcdir)/cp/cfns.h:
|
||||||
|
+ endif
|
||||||
|
+- gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \
|
||||||
|
++ gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L C++ \
|
||||||
|
+ $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h
|
||||||
|
+
|
||||||
|
+ #
|
||||||
|
+diff --git a/gcc/cp/cfns.gperf b/gcc/cp/cfns.gperf
|
||||||
|
+index 05ca753..d9b16b8 100644
|
||||||
|
+--- a/gcc/cp/cfns.gperf
|
||||||
|
++++ b/gcc/cp/cfns.gperf
|
||||||
|
+@@ -1,3 +1,5 @@
|
||||||
|
++%language=C++
|
||||||
|
++%define class-name libc_name
|
||||||
|
+ %{
|
||||||
|
+ /* Copyright (C) 2000-2014 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+@@ -16,14 +18,6 @@ for more details.
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with GCC; see the file COPYING3. If not see
|
||||||
|
+ <http://www.gnu.org/licenses/>. */
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#endif
|
||||||
|
+-static unsigned int hash (const char *, unsigned int);
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#endif
|
||||||
|
+-const char * libc_name_p (const char *, unsigned int);
|
||||||
|
+ %}
|
||||||
|
+ %%
|
||||||
|
+ # The standard C library functions, for feeding to gperf; the result is used
|
||||||
|
+diff --git a/gcc/cp/cfns.h b/gcc/cp/cfns.h
|
||||||
|
+index c845ddf..65801d1 100644
|
||||||
|
+--- a/gcc/cp/cfns.h
|
||||||
|
++++ b/gcc/cp/cfns.h
|
||||||
|
+@@ -1,5 +1,5 @@
|
||||||
|
+-/* ANSI-C code produced by gperf version 3.0.3 */
|
||||||
|
+-/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C cfns.gperf */
|
||||||
|
++/* C++ code produced by gperf version 3.0.4 */
|
||||||
|
++/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L C++ --output-file cfns.h cfns.gperf */
|
||||||
|
+
|
||||||
|
+ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||||
|
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
||||||
|
+@@ -28,7 +28,7 @@
|
||||||
|
+ #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
+-#line 1 "cfns.gperf"
|
||||||
|
++#line 3 "cfns.gperf"
|
||||||
|
+
|
||||||
|
+ /* Copyright (C) 2000-2014 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+@@ -47,25 +47,18 @@ for more details.
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with GCC; see the file COPYING3. If not see
|
||||||
|
+ <http://www.gnu.org/licenses/>. */
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#endif
|
||||||
|
+-static unsigned int hash (const char *, unsigned int);
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#endif
|
||||||
|
+-const char * libc_name_p (const char *, unsigned int);
|
||||||
|
+ /* maximum key range = 391, duplicates = 0 */
|
||||||
|
+
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#else
|
||||||
|
+-#ifdef __cplusplus
|
||||||
|
+-inline
|
||||||
|
+-#endif
|
||||||
|
+-#endif
|
||||||
|
+-static unsigned int
|
||||||
|
+-hash (register const char *str, register unsigned int len)
|
||||||
|
++class libc_name
|
||||||
|
++{
|
||||||
|
++private:
|
||||||
|
++ static inline unsigned int hash (const char *str, unsigned int len);
|
||||||
|
++public:
|
||||||
|
++ static const char *libc_name_p (const char *str, unsigned int len);
|
||||||
|
++};
|
||||||
|
++
|
||||||
|
++inline unsigned int
|
||||||
|
++libc_name::hash (register const char *str, register unsigned int len)
|
||||||
|
+ {
|
||||||
|
+ static const unsigned short asso_values[] =
|
||||||
|
+ {
|
||||||
|
+@@ -122,14 +115,8 @@ hash (register const char *str, register unsigned int len)
|
||||||
|
+ return hval + asso_values[(unsigned char)str[len - 1]];
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+-#ifdef __GNUC__
|
||||||
|
+-__inline
|
||||||
|
+-#ifdef __GNUC_STDC_INLINE__
|
||||||
|
+-__attribute__ ((__gnu_inline__))
|
||||||
|
+-#endif
|
||||||
|
+-#endif
|
||||||
|
+ const char *
|
||||||
|
+-libc_name_p (register const char *str, register unsigned int len)
|
||||||
|
++libc_name::libc_name_p (register const char *str, register unsigned int len)
|
||||||
|
+ {
|
||||||
|
+ enum
|
||||||
|
+ {
|
||||||
|
+diff --git a/gcc/cp/except.c b/gcc/cp/except.c
|
||||||
|
+index 221971a..32340f5 100644
|
||||||
|
+--- a/gcc/cp/except.c
|
||||||
|
++++ b/gcc/cp/except.c
|
||||||
|
+@@ -1030,7 +1030,8 @@ nothrow_libfn_p (const_tree fn)
|
||||||
|
+ unless the system headers are playing rename tricks, and if
|
||||||
|
+ they are, we don't want to be confused by them. */
|
||||||
|
+ id = DECL_NAME (fn);
|
||||||
|
+- return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
|
||||||
|
++ return !!libc_name::libc_name_p (IDENTIFIER_POINTER (id),
|
||||||
|
++ IDENTIFIER_LENGTH (id));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Returns nonzero if an exception of type FROM will be caught by a
|
||||||
|
+--
|
||||||
|
+1.7.1
|
||||||
|
+
|
@ -0,0 +1,46 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 13 May 2016 20:59:44 +0200
|
||||||
|
Subject: ath79: dev-eth: fix QCA9561 set phy interface mode and mask
|
||||||
|
|
||||||
|
QCA9563 and QCA9561 are two series of Qualcomm SoC Dragonfly. The only different
|
||||||
|
is QCA9563 w/o internal switch. It has one GMAC with SGMII interface. But they
|
||||||
|
have the same device ID(0x1150). So they share the same codes.
|
||||||
|
|
||||||
|
Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
|
||||||
|
|
||||||
|
Backport of OpenWrt r46971
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
|
||||||
|
index ff94e2e..31d2438 100644
|
||||||
|
--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
|
||||||
|
+++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
|
||||||
|
@@ -633,7 +633,6 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
|
||||||
|
case ATH79_SOC_AR9330:
|
||||||
|
case ATH79_SOC_AR9331:
|
||||||
|
case ATH79_SOC_QCA9533:
|
||||||
|
- case ATH79_SOC_QCA9561:
|
||||||
|
case ATH79_SOC_TP9343:
|
||||||
|
pdata->phy_if_mode = PHY_INTERFACE_MODE_MII;
|
||||||
|
break;
|
||||||
|
@@ -667,6 +666,11 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case ATH79_SOC_QCA9561:
|
||||||
|
+ if (!pdata->phy_if_mode)
|
||||||
|
+ pdata->phy_if_mode = PHY_INTERFACE_MODE_MII;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
@@ -1035,7 +1039,8 @@ void __init ath79_register_eth(unsigned int id)
|
||||||
|
AR933X_RESET_GE0_MDIO;
|
||||||
|
pdata->set_speed = ath79_set_speed_dummy;
|
||||||
|
|
||||||
|
- pdata->phy_mask = BIT(4);
|
||||||
|
+ if (!pdata->phy_mask)
|
||||||
|
+ pdata->phy_mask = BIT(4);
|
||||||
|
} else {
|
||||||
|
pdata->reset_bit = AR933X_RESET_GE1_MAC |
|
||||||
|
AR933X_RESET_GE1_MDIO;
|
@ -0,0 +1,33 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 13 May 2016 22:58:50 +0200
|
||||||
|
Subject: ar71xx: use correct PLL configuration register bitmask for QCA956x SoC.
|
||||||
|
|
||||||
|
Incorrect value causes clock inaccuracy as huge as 1/60.
|
||||||
|
|
||||||
|
Signed-off-by: Dmitry Ivanov <dima@ubnt.com>
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
|
Backport of OpenWrt r47363
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
index b5c88e9..d3a14b2 100644
|
||||||
|
--- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
+++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
@@ -529,7 +529,7 @@
|
||||||
|
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT 0
|
||||||
|
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK 0x1f
|
||||||
|
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT 5
|
||||||
|
-+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK 0x3fff
|
||||||
|
++#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK 0x1fff
|
||||||
|
+#define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT 18
|
||||||
|
+#define QCA956X_PLL_CPU_CONFIG1_NINT_MASK 0x1ff
|
||||||
|
+
|
||||||
|
@@ -541,7 +541,7 @@
|
||||||
|
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT 0
|
||||||
|
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK 0x1f
|
||||||
|
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT 5
|
||||||
|
-+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK 0x3fff
|
||||||
|
++#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK 0x1fff
|
||||||
|
+#define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT 18
|
||||||
|
+#define QCA956X_PLL_DDR_CONFIG1_NINT_MASK 0x1ff
|
||||||
|
+
|
381
patches/openwrt/0038-ar71xx-update-QCA956x-support.patch
Normal file
381
patches/openwrt/0038-ar71xx-update-QCA956x-support.patch
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Fri, 13 May 2016 22:18:40 +0200
|
||||||
|
Subject: ar71xx: update QCA956x support
|
||||||
|
|
||||||
|
- separate qca956x and tp9343 (they use different IDs)
|
||||||
|
- rename qca9561->qca956x for consistency
|
||||||
|
- add missing bits (device reset, gpio output select)
|
||||||
|
- fix wmac setup
|
||||||
|
|
||||||
|
Signed-off-by: Roman Yeryomin <roman@advem.lv>
|
||||||
|
|
||||||
|
Backport of OpenWrt r47981
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
index d3a14b2..61b8976 100644
|
||||||
|
--- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
+++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
|
||||||
|
@@ -105,7 +105,7 @@
|
||||||
|
qca953x_clocks_init();
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
qca955x_clocks_init();
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ qca956x_clocks_init();
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
@@ -116,7 +116,7 @@
|
||||||
|
reg = QCA953X_RESET_REG_RESET_MODULE;
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
reg = QCA955X_RESET_REG_RESET_MODULE;
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ reg = QCA956X_RESET_REG_RESET_MODULE;
|
||||||
|
else
|
||||||
|
panic("Reset register not defined for this SOC");
|
||||||
|
@@ -125,20 +125,30 @@
|
||||||
|
reg = QCA953X_RESET_REG_RESET_MODULE;
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
reg = QCA955X_RESET_REG_RESET_MODULE;
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ reg = QCA956X_RESET_REG_RESET_MODULE;
|
||||||
|
else
|
||||||
|
panic("Reset register not defined for this SOC");
|
||||||
|
|
||||||
|
+@@ -133,6 +137,8 @@ u32 ath79_device_reset_get(u32 mask)
|
||||||
|
+ reg = AR933X_RESET_REG_RESET_MODULE;
|
||||||
|
+ else if (soc_is_ar934x())
|
||||||
|
+ reg = AR934X_RESET_REG_RESET_MODULE;
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
++ reg = QCA956X_RESET_REG_RESET_MODULE;
|
||||||
|
+ else
|
||||||
|
+ BUG();
|
||||||
|
+
|
||||||
|
--- a/arch/mips/ath79/dev-common.c
|
||||||
|
+++ b/arch/mips/ath79/dev-common.c
|
||||||
|
-@@ -94,7 +94,8 @@ void __init ath79_register_uart(void)
|
||||||
|
+@@ -94,7 +94,9 @@ void __init ath79_register_uart(void)
|
||||||
|
soc_is_ar913x() ||
|
||||||
|
soc_is_ar934x() ||
|
||||||
|
soc_is_qca953x() ||
|
||||||
|
- soc_is_qca955x()) {
|
||||||
|
+ soc_is_qca955x() ||
|
||||||
|
-+ soc_is_qca956x()) {
|
||||||
|
++ soc_is_qca956x() ||
|
||||||
|
++ soc_is_tp9343()) {
|
||||||
|
ath79_uart_data[0].uartclk = uart_clk_rate;
|
||||||
|
platform_device_register(&ath79_uart_device);
|
||||||
|
} else if (soc_is_ar933x()) {
|
||||||
|
@@ -168,14 +178,14 @@
|
||||||
|
qca953x_usb_setup();
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
qca955x_usb_setup();
|
||||||
|
-+ else if (soc_is_qca9561())
|
||||||
|
++ else if (soc_is_qca956x())
|
||||||
|
+ qca956x_usb_setup();
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
--- a/arch/mips/ath79/dev-wmac.c
|
||||||
|
+++ b/arch/mips/ath79/dev-wmac.c
|
||||||
|
-@@ -189,6 +189,24 @@ static void qca955x_wmac_setup(void)
|
||||||
|
+@@ -189,6 +189,26 @@ static void qca955x_wmac_setup(void)
|
||||||
|
ath79_wmac_data.is_clk_25mhz = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -195,16 +205,18 @@
|
||||||
|
+ ath79_wmac_data.is_clk_25mhz = false;
|
||||||
|
+ else
|
||||||
|
+ ath79_wmac_data.is_clk_25mhz = true;
|
||||||
|
++
|
||||||
|
++ ath79_wmac_data.get_mac_revision = ar93xx_get_soc_revision;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static bool __init
|
||||||
|
ar93xx_wmac_otp_read_word(void __iomem *base, int addr, u32 *data)
|
||||||
|
{
|
||||||
|
-@@ -392,6 +410,8 @@ void __init ath79_register_wmac(u8 *cal_
|
||||||
|
+@@ -392,6 +412,8 @@ void __init ath79_register_wmac(u8 *cal_
|
||||||
|
qca953x_wmac_setup();
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
qca955x_wmac_setup();
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ qca956x_wmac_setup();
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
@@ -216,27 +228,38 @@
|
||||||
|
case REV_ID_MAJOR_QCA9556:
|
||||||
|
case REV_ID_MAJOR_QCA9558:
|
||||||
|
+ case REV_ID_MAJOR_TP9343:
|
||||||
|
-+ case REV_ID_MAJOR_QCA9561:
|
||||||
|
++ case REV_ID_MAJOR_QCA956X:
|
||||||
|
_prom_putchar = prom_putchar_ar71xx;
|
||||||
|
break;
|
||||||
|
|
||||||
|
--- a/arch/mips/ath79/gpio.c
|
||||||
|
+++ b/arch/mips/ath79/gpio.c
|
||||||
|
-@@ -148,7 +148,8 @@ static void __iomem *ath79_gpio_get_func
|
||||||
|
+@@ -148,7 +148,10 @@ static void __iomem *ath79_gpio_get_func
|
||||||
|
soc_is_ar913x() ||
|
||||||
|
soc_is_ar933x())
|
||||||
|
reg = AR71XX_GPIO_REG_FUNC;
|
||||||
|
- else if (soc_is_ar934x() || soc_is_qca953x())
|
||||||
|
+ else if (soc_is_ar934x() ||
|
||||||
|
-+ soc_is_qca953x() || soc_is_qca956x())
|
||||||
|
++ soc_is_qca953x() ||
|
||||||
|
++ soc_is_qca956x() ||
|
||||||
|
++ soc_is_tp9343())
|
||||||
|
reg = AR934X_GPIO_REG_FUNC;
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
-@@ -228,12 +229,15 @@ void __init ath79_gpio_init(void)
|
||||||
|
+@@ -187,7 +190,7 @@ void __init ath79_gpio_output_select(uns
|
||||||
|
+ unsigned int reg;
|
||||||
|
+ u32 t, s;
|
||||||
|
+
|
||||||
|
+- BUG_ON(!soc_is_ar934x() && !soc_is_qca953x());
|
||||||
|
++ BUG_ON(!soc_is_ar934x() && !soc_is_qca953x() && !soc_is_qca956x());
|
||||||
|
+
|
||||||
|
+ if (gpio >= AR934X_GPIO_COUNT)
|
||||||
|
+ return;
|
||||||
|
+@@ -228,12 +231,15 @@ void __init ath79_gpio_init(void)
|
||||||
|
ath79_gpio_count = QCA953X_GPIO_COUNT;
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
ath79_gpio_count = QCA955X_GPIO_COUNT;
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ ath79_gpio_count = QCA956X_GPIO_COUNT;
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
@@ -245,23 +268,24 @@
|
||||||
|
ath79_gpio_chip.ngpio = ath79_gpio_count;
|
||||||
|
- if (soc_is_ar934x() || soc_is_qca953x() || soc_is_qca955x()) {
|
||||||
|
+ if (soc_is_ar934x() || soc_is_qca953x() || soc_is_qca955x() ||
|
||||||
|
-+ soc_is_qca956x()) {
|
||||||
|
++ soc_is_qca956x() || soc_is_tp9343()) {
|
||||||
|
ath79_gpio_chip.direction_input = ar934x_gpio_direction_input;
|
||||||
|
ath79_gpio_chip.direction_output = ar934x_gpio_direction_output;
|
||||||
|
}
|
||||||
|
--- a/arch/mips/ath79/irq.c
|
||||||
|
+++ b/arch/mips/ath79/irq.c
|
||||||
|
-@@ -107,7 +107,8 @@ static void __init ath79_misc_irq_init(v
|
||||||
|
+@@ -107,7 +107,9 @@ static void __init ath79_misc_irq_init(v
|
||||||
|
soc_is_ar933x() ||
|
||||||
|
soc_is_ar934x() ||
|
||||||
|
soc_is_qca953x() ||
|
||||||
|
- soc_is_qca955x())
|
||||||
|
+ soc_is_qca955x() ||
|
||||||
|
-+ soc_is_qca956x())
|
||||||
|
++ soc_is_qca956x() ||
|
||||||
|
++ soc_is_tp9343())
|
||||||
|
ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
-@@ -268,6 +269,97 @@ static void qca955x_irq_init(void)
|
||||||
|
+@@ -268,6 +270,97 @@ static void qca955x_irq_init(void)
|
||||||
|
irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -359,21 +383,21 @@
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned long pending;
|
||||||
|
-@@ -397,6 +489,9 @@ void __init arch_init_irq(void)
|
||||||
|
+@@ -397,6 +490,9 @@ void __init arch_init_irq(void)
|
||||||
|
} else if (soc_is_qca955x()) {
|
||||||
|
ath79_ip2_handler = ath79_default_ip2_handler;
|
||||||
|
ath79_ip3_handler = ath79_default_ip3_handler;
|
||||||
|
-+ } else if (soc_is_qca956x()) {
|
||||||
|
++ } else if (soc_is_qca956x() || soc_is_tp9343()) {
|
||||||
|
+ ath79_ip2_handler = ath79_default_ip2_handler;
|
||||||
|
+ ath79_ip3_handler = ath79_default_ip3_handler;
|
||||||
|
} else {
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
-@@ -411,4 +506,6 @@ void __init arch_init_irq(void)
|
||||||
|
+@@ -411,4 +507,6 @@ void __init arch_init_irq(void)
|
||||||
|
qca953x_irq_init();
|
||||||
|
else if (soc_is_qca955x())
|
||||||
|
qca955x_irq_init();
|
||||||
|
-+ else if (soc_is_qca956x())
|
||||||
|
++ else if (soc_is_qca956x() || soc_is_tp9343())
|
||||||
|
+ qca956x_irq_init();
|
||||||
|
}
|
||||||
|
--- a/arch/mips/ath79/Kconfig
|
||||||
|
@@ -428,7 +452,7 @@
|
||||||
|
} else if (soc_is_qca955x()) {
|
||||||
|
ath79_pci_irq_map = qca955x_pci_irq_map;
|
||||||
|
ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map);
|
||||||
|
-+ } else if (soc_is_qca9561()) {
|
||||||
|
++ } else if (soc_is_qca956x()) {
|
||||||
|
+ ath79_pci_irq_map = qca956x_pci_irq_map;
|
||||||
|
+ ath79_pci_nr_irqs = ARRAY_SIZE(qca956x_pci_irq_map);
|
||||||
|
} else {
|
||||||
|
@@ -438,7 +462,7 @@
|
||||||
|
QCA955X_PCI_MEM_SIZE,
|
||||||
|
1,
|
||||||
|
ATH79_IP3_IRQ(2));
|
||||||
|
-+ } else if (soc_is_qca9561()) {
|
||||||
|
++ } else if (soc_is_qca956x()) {
|
||||||
|
+ pdev = ath79_register_pci_ar724x(0,
|
||||||
|
+ QCA956X_PCI_CFG_BASE1,
|
||||||
|
+ QCA956X_PCI_CTRL_BASE1,
|
||||||
|
@@ -456,15 +480,15 @@
|
||||||
|
rev = id & QCA955X_REV_ID_REVISION_MASK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
-+ case REV_ID_MAJOR_TP9343:
|
||||||
|
-+ ath79_soc = ATH79_SOC_TP9343;
|
||||||
|
-+ chip = "9343";
|
||||||
|
++ case REV_ID_MAJOR_QCA956X:
|
||||||
|
++ ath79_soc = ATH79_SOC_QCA956X;
|
||||||
|
++ chip = "956X";
|
||||||
|
+ rev = id & QCA956X_REV_ID_REVISION_MASK;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
-+ case REV_ID_MAJOR_QCA9561:
|
||||||
|
-+ ath79_soc = ATH79_SOC_QCA9561;
|
||||||
|
-+ chip = "9561";
|
||||||
|
++ case REV_ID_MAJOR_TP9343:
|
||||||
|
++ ath79_soc = ATH79_SOC_TP9343;
|
||||||
|
++ chip = "9343";
|
||||||
|
+ rev = id & QCA956X_REV_ID_REVISION_MASK;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
@@ -476,7 +500,7 @@
|
||||||
|
ath79_soc_rev = rev;
|
||||||
|
|
||||||
|
- if (soc_is_qca953x() || soc_is_qca955x())
|
||||||
|
-+ if (soc_is_qca953x() || soc_is_qca955x() || soc_is_qca9561())
|
||||||
|
++ if (soc_is_qca953x() || soc_is_qca955x() || soc_is_qca956x())
|
||||||
|
sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s ver %u rev %u",
|
||||||
|
chip, ver, rev);
|
||||||
|
+ else if (soc_is_tp9343())
|
||||||
|
@@ -511,7 +535,21 @@
|
||||||
|
#define AR9300_OTP_BASE 0x14000
|
||||||
|
#define AR9300_OTP_STATUS 0x15f18
|
||||||
|
#define AR9300_OTP_STATUS_TYPE 0x7
|
||||||
|
-@@ -375,6 +392,49 @@
|
||||||
|
+@@ -152,6 +169,13 @@
|
||||||
|
+ #define AR9300_OTP_READ_DATA 0x15f1c
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
++ * Hidden Registers
|
||||||
|
++ */
|
||||||
|
++#define QCA956X_DAM_RESET_OFFSET 0xb90001bc
|
||||||
|
++#define QCA956X_DAM_RESET_SIZE 0x4
|
||||||
|
++#define QCA956X_INLINE_CHKSUM_ENG BIT(27)
|
||||||
|
++
|
||||||
|
++/*
|
||||||
|
+ * DDR_CTRL block
|
||||||
|
+ */
|
||||||
|
+ #define AR71XX_DDR_REG_PCI_WIN0 0x7c
|
||||||
|
+@@ -375,6 +399,49 @@
|
||||||
|
#define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL BIT(21)
|
||||||
|
#define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24)
|
||||||
|
|
||||||
|
@@ -561,7 +599,7 @@
|
||||||
|
/*
|
||||||
|
* USB_CONFIG block
|
||||||
|
*/
|
||||||
|
-@@ -422,6 +482,11 @@
|
||||||
|
+@@ -422,6 +489,11 @@
|
||||||
|
#define QCA955X_RESET_REG_BOOTSTRAP 0xb0
|
||||||
|
#define QCA955X_RESET_REG_EXT_INT_STATUS 0xac
|
||||||
|
|
||||||
|
@@ -573,7 +611,7 @@
|
||||||
|
#define MISC_INT_ETHSW BIT(12)
|
||||||
|
#define MISC_INT_TIMER4 BIT(10)
|
||||||
|
#define MISC_INT_TIMER3 BIT(9)
|
||||||
|
-@@ -596,6 +661,8 @@
|
||||||
|
+@@ -596,6 +668,8 @@
|
||||||
|
|
||||||
|
#define QCA955X_BOOTSTRAP_REF_CLK_40 BIT(4)
|
||||||
|
|
||||||
|
@@ -582,7 +620,7 @@
|
||||||
|
#define AR934X_PCIE_WMAC_INT_WMAC_MISC BIT(0)
|
||||||
|
#define AR934X_PCIE_WMAC_INT_WMAC_TX BIT(1)
|
||||||
|
#define AR934X_PCIE_WMAC_INT_WMAC_RXLP BIT(2)
|
||||||
|
-@@ -663,6 +730,37 @@
|
||||||
|
+@@ -663,6 +737,37 @@
|
||||||
|
QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \
|
||||||
|
QCA955X_EXT_INT_PCIE_RC2_INT3)
|
||||||
|
|
||||||
|
@@ -620,16 +658,16 @@
|
||||||
|
#define REV_ID_MAJOR_MASK 0xfff0
|
||||||
|
#define REV_ID_MAJOR_AR71XX 0x00a0
|
||||||
|
#define REV_ID_MAJOR_AR913X 0x00b0
|
||||||
|
-@@ -678,6 +776,8 @@
|
||||||
|
+@@ -678,6 +783,8 @@
|
||||||
|
#define REV_ID_MAJOR_QCA9533_V2 0x0160
|
||||||
|
#define REV_ID_MAJOR_QCA9556 0x0130
|
||||||
|
#define REV_ID_MAJOR_QCA9558 0x1130
|
||||||
|
+#define REV_ID_MAJOR_TP9343 0x0150
|
||||||
|
-+#define REV_ID_MAJOR_QCA9561 0x1150
|
||||||
|
++#define REV_ID_MAJOR_QCA956X 0x1150
|
||||||
|
|
||||||
|
#define AR71XX_REV_ID_MINOR_MASK 0x3
|
||||||
|
#define AR71XX_REV_ID_MINOR_AR7130 0x0
|
||||||
|
-@@ -702,6 +802,8 @@
|
||||||
|
+@@ -702,6 +809,8 @@
|
||||||
|
|
||||||
|
#define QCA955X_REV_ID_REVISION_MASK 0xf
|
||||||
|
|
||||||
|
@@ -638,7 +676,7 @@
|
||||||
|
/*
|
||||||
|
* SPI block
|
||||||
|
*/
|
||||||
|
-@@ -766,6 +868,19 @@
|
||||||
|
+@@ -766,6 +875,19 @@
|
||||||
|
#define QCA953X_GPIO_OUT_MUX_LED_LINK4 44
|
||||||
|
#define QCA953X_GPIO_OUT_MUX_LED_LINK5 45
|
||||||
|
|
||||||
|
@@ -658,7 +696,7 @@
|
||||||
|
#define AR71XX_GPIO_COUNT 16
|
||||||
|
#define AR7240_GPIO_COUNT 18
|
||||||
|
#define AR7241_GPIO_COUNT 20
|
||||||
|
-@@ -774,6 +889,7 @@
|
||||||
|
+@@ -774,6 +896,7 @@
|
||||||
|
#define AR934X_GPIO_COUNT 23
|
||||||
|
#define QCA953X_GPIO_COUNT 18
|
||||||
|
#define QCA955X_GPIO_COUNT 24
|
||||||
|
@@ -673,11 +711,11 @@
|
||||||
|
ATH79_SOC_QCA9556,
|
||||||
|
ATH79_SOC_QCA9558,
|
||||||
|
+ ATH79_SOC_TP9343,
|
||||||
|
-+ ATH79_SOC_QCA9561,
|
||||||
|
++ ATH79_SOC_QCA956X,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern enum ath79_soc_type ath79_soc;
|
||||||
|
-@@ -126,6 +128,21 @@ static inline int soc_is_qca955x(void)
|
||||||
|
+@@ -126,6 +128,26 @@ static inline int soc_is_qca955x(void)
|
||||||
|
return soc_is_qca9556() || soc_is_qca9558();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -685,15 +723,20 @@
|
||||||
|
+{
|
||||||
|
+ return ath79_soc == ATH79_SOC_TP9343;
|
||||||
|
+}
|
||||||
|
-+
|
||||||
|
++
|
||||||
|
+static inline int soc_is_qca9561(void)
|
||||||
|
+{
|
||||||
|
-+ return ath79_soc == ATH79_SOC_QCA9561;
|
||||||
|
++ return ath79_soc == ATH79_SOC_QCA956X;
|
||||||
|
++}
|
||||||
|
++
|
||||||
|
++static inline int soc_is_qca9563(void)
|
||||||
|
++{
|
||||||
|
++ return ath79_soc == ATH79_SOC_QCA956X;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int soc_is_qca956x(void)
|
||||||
|
+{
|
||||||
|
-+ return soc_is_tp9343() || soc_is_qca9561();
|
||||||
|
++ return soc_is_qca9561() || soc_is_qca9563();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
extern void __iomem *ath79_ddr_base;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user