reset upstream subtrees to yocto 2.6

Reset the following subtrees on thud HEAD:

  poky: 87e3a9739d
  meta-openembedded: 6094ae18c8
  meta-security: 31dc4e7532
  meta-raspberrypi: a48743dc36
  meta-xilinx: c42016e2e6

Also re-apply backports that didn't make it into thud:
  poky:
    17726d0 systemd-systemctl-native: handle Install wildcards

  meta-openembedded:
    4321a5d libtinyxml2: update to 7.0.1
    042f0a3 libcereal: Add native and nativesdk classes
    e23284f libcereal: Allow empty package
    030e8d4 rsyslog: curl-less build with fmhttp PACKAGECONFIG
    179a1b9 gtest: update to 1.8.1

Squashed OpenBMC subtree compatibility updates:
  meta-aspeed:
    Brad Bishop (1):
          aspeed: add yocto 2.6 compatibility

  meta-ibm:
    Brad Bishop (1):
          ibm: prepare for yocto 2.6

  meta-ingrasys:
    Brad Bishop (1):
          ingrasys: set layer compatibility to yocto 2.6

  meta-openpower:
    Brad Bishop (1):
          openpower: set layer compatibility to yocto 2.6

  meta-phosphor:
    Brad Bishop (3):
          phosphor: set layer compatibility to thud
          phosphor: libgpg-error: drop patches
          phosphor: react to fitimage artifact rename

    Ed Tanous (4):
          Dropbear: upgrade options for latest upgrade
          yocto2.6: update openssl options
          busybox: remove upstream watchdog patch
          systemd: Rebase CONFIG_CGROUP_BPF patch

Change-Id: I7b1fe71cca880d0372a82d94b5fd785323e3a9e7
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch b/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch
new file mode 100644
index 0000000..3752158
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch
@@ -0,0 +1,784 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Xose Vazquez Perez <xose.vazquez@gmail.com>
+Date: Sun, 13 May 2018 00:39:42 +0200
+Subject: [PATCH] multipath-tools: refresh kernel-doc from kernel sources
+
+Cc: Gris Ge <fge@redhat.com>
+Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
+Cc: device-mapper development <dm-devel@redhat.com>
+Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
+Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
+---
+ libdmmp/docs/kernel-doc | 671 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 368 insertions(+), 303 deletions(-)
+
+diff --git a/libdmmp/docs/kernel-doc b/libdmmp/docs/kernel-doc
+index fee8952..0057d8e 100755
+--- a/libdmmp/docs/kernel-doc
++++ b/libdmmp/docs/kernel-doc
+@@ -1,4 +1,5 @@
+ #!/usr/bin/env perl
++# SPDX-License-Identifier: GPL-2.0
+ 
+ use warnings;
+ use strict;
+@@ -328,13 +329,15 @@ my $lineprefix="";
+ use constant {
+     STATE_NORMAL        => 0, # normal code
+     STATE_NAME          => 1, # looking for function name
+-    STATE_FIELD         => 2, # scanning field start
+-    STATE_PROTO         => 3, # scanning prototype
+-    STATE_DOCBLOCK      => 4, # documentation block
+-    STATE_INLINE        => 5, # gathering documentation outside main block
++    STATE_BODY_MAYBE    => 2, # body - or maybe more description
++    STATE_BODY          => 3, # the body of the comment
++    STATE_PROTO         => 4, # scanning prototype
++    STATE_DOCBLOCK      => 5, # documentation block
++    STATE_INLINE        => 6, # gathering documentation outside main block
+ };
+ my $state;
+ my $in_doc_sect;
++my $leading_space;
+ 
+ # Inline documentation state
+ use constant {
+@@ -363,7 +366,7 @@ my $doc_sect = $doc_com .
+ my $doc_content = $doc_com_body . '(.*)';
+ my $doc_block = $doc_com . 'DOC:\s*(.*)?';
+ my $doc_inline_start = '^\s*/\*\*\s*$';
+-my $doc_inline_sect = '\s*\*\s*(@[\w\s]+):(.*)';
++my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
+ my $doc_inline_end = '^\s*\*/\s*$';
+ my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
+ my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
+@@ -553,10 +556,9 @@ sub output_highlight {
+ 	}
+ 	if ($line eq ""){
+ 	    if (! $output_preformatted) {
+-		print $lineprefix, local_unescape($blankline);
++		print $lineprefix, $blankline;
+ 	    }
+ 	} else {
+-	    $line =~ s/\\\\\\/\&/g;
+ 	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
+ 		print "\\&$line";
+ 	    } else {
+@@ -747,17 +749,73 @@ sub output_blockhead_rst(%) {
+     }
+ }
+ 
+-sub output_highlight_rst {
+-    my $contents = join "\n",@_;
+-    my $line;
+-
+-    # undo the evil effects of xml_escape() earlier
+-    $contents = xml_unescape($contents);
+-
++#
++# Apply the RST highlights to a sub-block of text.
++#   
++sub highlight_block($) {
++    # The dohighlight kludge requires the text be called $contents
++    my $contents = shift;
+     eval $dohighlight;
+     die $@ if $@;
++    return $contents;
++}
+ 
+-    foreach $line (split "\n", $contents) {
++#
++# Regexes used only here.
++#
++my $sphinx_literal = '^[^.].*::$';
++my $sphinx_cblock = '^\.\.\ +code-block::';
++
++sub output_highlight_rst {
++    my $input = join "\n",@_;
++    my $output = "";
++    my $line;
++    my $in_literal = 0;
++    my $litprefix;
++    my $block = "";
++
++    foreach $line (split "\n",$input) {
++	#
++	# If we're in a literal block, see if we should drop out
++	# of it.  Otherwise pass the line straight through unmunged.
++	#
++	if ($in_literal) {
++	    if (! ($line =~ /^\s*$/)) {
++		#
++		# If this is the first non-blank line in a literal
++		# block we need to figure out what the proper indent is.
++		#
++		if ($litprefix eq "") {
++		    $line =~ /^(\s*)/;
++		    $litprefix = '^' . $1;
++		    $output .= $line . "\n";
++		} elsif (! ($line =~ /$litprefix/)) {
++		    $in_literal = 0;
++		} else {
++		    $output .= $line . "\n";
++		}
++	    } else {
++		$output .= $line . "\n";
++	    }
++	}
++	#
++	# Not in a literal block (or just dropped out)
++	#
++	if (! $in_literal) {
++	    $block .= $line . "\n";
++	    if (($line =~ /$sphinx_literal/) || ($line =~ /$sphinx_cblock/)) {
++		$in_literal = 1;
++		$litprefix = "";
++		$output .= highlight_block($block);
++		$block = ""
++	    }
++	}
++    }
++
++    if ($block) {
++	$output .= highlight_block($block);
++    }
++    foreach $line (split "\n", $output) {
+ 	print $lineprefix . $line . "\n";
+     }
+ }
+@@ -1062,7 +1120,7 @@ sub dump_struct($$) {
+ 					# Handle bitmaps
+ 					$arg =~ s/:\s*\d+\s*//g;
+ 					# Handle arrays
+-					$arg =~ s/\[\S+\]//g;
++					$arg =~ s/\[.*\]//g;
+ 					# The type may have multiple words,
+ 					# and multiple IDs can be defined, like:
+ 					#	const struct foo, *bar, foobar
+@@ -1422,8 +1480,6 @@ sub push_parameter($$$$) {
+ 		}
+ 	}
+ 
+-	$param = xml_escape($param);
+-
+ 	# strip spaces from $param so that it is one continuous string
+ 	# on @parameterlist;
+ 	# this fixes a problem where check_sections() cannot find
+@@ -1522,6 +1578,7 @@ sub dump_function($$) {
+     $prototype =~ s/__meminit +//;
+     $prototype =~ s/__must_check +//;
+     $prototype =~ s/__weak +//;
++    $prototype =~ s/__sched +//;
+     my $define = $prototype =~ s/^#\s*define\s+//; #ak added
+     $prototype =~ s/__attribute__\s*\(\(
+             (?:
+@@ -1748,47 +1805,6 @@ sub process_proto_type($$) {
+     }
+ }
+ 
+-# xml_escape: replace <, >, and & in the text stream;
+-#
+-# however, formatting controls that are generated internally/locally in the
+-# kernel-doc script are not escaped here; instead, they begin life like
+-# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
+-# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
+-# just before actual output; (this is done by local_unescape())
+-sub xml_escape($) {
+-	my $text = shift;
+-	if ($output_mode eq "man") {
+-		return $text;
+-	}
+-	$text =~ s/\&/\\\\\\amp;/g;
+-	$text =~ s/\</\\\\\\lt;/g;
+-	$text =~ s/\>/\\\\\\gt;/g;
+-	return $text;
+-}
+-
+-# xml_unescape: reverse the effects of xml_escape
+-sub xml_unescape($) {
+-	my $text = shift;
+-	if ($output_mode eq "man") {
+-		return $text;
+-	}
+-	$text =~ s/\\\\\\amp;/\&/g;
+-	$text =~ s/\\\\\\lt;/</g;
+-	$text =~ s/\\\\\\gt;/>/g;
+-	return $text;
+-}
+-
+-# convert local escape strings to html
+-# local escape strings look like:  '\\\\menmonic:' (that's 4 backslashes)
+-sub local_unescape($) {
+-	my $text = shift;
+-	if ($output_mode eq "man") {
+-		return $text;
+-	}
+-	$text =~ s/\\\\\\\\lt:/</g;
+-	$text =~ s/\\\\\\\\gt:/>/g;
+-	return $text;
+-}
+ 
+ sub map_filename($) {
+     my $file;
+@@ -1826,15 +1842,291 @@ sub process_export_file($) {
+     close(IN);
+ }
+ 
+-sub process_file($) {
+-    my $file;
++#
++# Parsers for the various processing states.
++#
++# STATE_NORMAL: looking for the /** to begin everything.
++#
++sub process_normal() {
++    if (/$doc_start/o) {
++	$state = STATE_NAME;	# next line is always the function name
++	$in_doc_sect = 0;
++	$declaration_start_line = $. + 1;
++    }
++}
++
++#
++# STATE_NAME: Looking for the "name - description" line
++#
++sub process_name($$) {
++    my $file = shift;
+     my $identifier;
+-    my $func;
+     my $descr;
+-    my $in_purpose = 0;
++
++    if (/$doc_block/o) {
++	$state = STATE_DOCBLOCK;
++	$contents = "";
++	$new_start_line = $. + 1;
++
++	if ( $1 eq "" ) {
++	    $section = $section_intro;
++	} else {
++	    $section = $1;
++	}
++    }
++    elsif (/$doc_decl/o) {
++	$identifier = $1;
++	if (/\s*([\w\s]+?)(\(\))?\s*-/) {
++	    $identifier = $1;
++	}
++
++	$state = STATE_BODY;
++	# if there's no @param blocks need to set up default section
++	# here
++	$contents = "";
++	$section = $section_default;
++	$new_start_line = $. + 1;
++	if (/-(.*)/) {
++	    # strip leading/trailing/multiple spaces
++	    $descr= $1;
++	    $descr =~ s/^\s*//;
++	    $descr =~ s/\s*$//;
++	    $descr =~ s/\s+/ /g;
++	    $declaration_purpose = $descr;
++	    $state = STATE_BODY_MAYBE;
++	} else {
++	    $declaration_purpose = "";
++	}
++
++	if (($declaration_purpose eq "") && $verbose) {
++	    print STDERR "${file}:$.: warning: missing initial short description on line:\n";
++	    print STDERR $_;
++	    ++$warnings;
++	}
++
++	if ($identifier =~ m/^struct/) {
++	    $decl_type = 'struct';
++	} elsif ($identifier =~ m/^union/) {
++	    $decl_type = 'union';
++	} elsif ($identifier =~ m/^enum/) {
++	    $decl_type = 'enum';
++	} elsif ($identifier =~ m/^typedef/) {
++	    $decl_type = 'typedef';
++	} else {
++	    $decl_type = 'function';
++	}
++
++	if ($verbose) {
++	    print STDERR "${file}:$.: info: Scanning doc for $identifier\n";
++	}
++    } else {
++	print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
++	    " - I thought it was a doc line\n";
++	++$warnings;
++	$state = STATE_NORMAL;
++    }
++}
++
++
++#
++# STATE_BODY and STATE_BODY_MAYBE: the bulk of a kerneldoc comment.
++#
++sub process_body($$) {
++    my $file = shift;
++
++    if (/$doc_sect/i) { # case insensitive for supported section names
++	$newsection = $1;
++	$newcontents = $2;
++
++	# map the supported section names to the canonical names
++	if ($newsection =~ m/^description$/i) {
++	    $newsection = $section_default;
++	} elsif ($newsection =~ m/^context$/i) {
++	    $newsection = $section_context;
++	} elsif ($newsection =~ m/^returns?$/i) {
++	    $newsection = $section_return;
++	} elsif ($newsection =~ m/^\@return$/) {
++	    # special: @return is a section, not a param description
++	    $newsection = $section_return;
++	}
++
++	if (($contents ne "") && ($contents ne "\n")) {
++	    if (!$in_doc_sect && $verbose) {
++		print STDERR "${file}:$.: warning: contents before sections\n";
++		++$warnings;
++	    }
++	    dump_section($file, $section, $contents);
++	    $section = $section_default;
++	}
++
++	$in_doc_sect = 1;
++	$state = STATE_BODY;
++	$contents = $newcontents;
++	$new_start_line = $.;
++	while (substr($contents, 0, 1) eq " ") {
++	    $contents = substr($contents, 1);
++	}
++	if ($contents ne "") {
++	    $contents .= "\n";
++	}
++	$section = $newsection;
++	$leading_space = undef;
++    } elsif (/$doc_end/) {
++	if (($contents ne "") && ($contents ne "\n")) {
++	    dump_section($file, $section, $contents);
++	    $section = $section_default;
++	    $contents = "";
++	}
++	# look for doc_com + <text> + doc_end:
++	if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
++	    print STDERR "${file}:$.: warning: suspicious ending line: $_";
++	    ++$warnings;
++	}
++
++	$prototype = "";
++	$state = STATE_PROTO;
++	$brcount = 0;
++    } elsif (/$doc_content/) {
++	# miguel-style comment kludge, look for blank lines after
++	# @parameter line to signify start of description
++	if ($1 eq "") {
++	    if ($section =~ m/^@/ || $section eq $section_context) {
++		dump_section($file, $section, $contents);
++		$section = $section_default;
++		$contents = "";
++		$new_start_line = $.;
++	    } else {
++		$contents .= "\n";
++	    }
++	    $state = STATE_BODY;
++	} elsif ($state == STATE_BODY_MAYBE) {
++	    # Continued declaration purpose
++	    chomp($declaration_purpose);
++	    $declaration_purpose .= " " . $1;
++	    $declaration_purpose =~ s/\s+/ /g;
++	} else {
++	    my $cont = $1;
++	    if ($section =~ m/^@/ || $section eq $section_context) {
++		if (!defined $leading_space) {
++		    if ($cont =~ m/^(\s+)/) {
++			$leading_space = $1;
++		    } else {
++			$leading_space = "";
++		    }
++		}
++		$cont =~ s/^$leading_space//;
++	    }
++	    $contents .= $cont . "\n";
++	}
++    } else {
++	# i dont know - bad line?  ignore.
++	print STDERR "${file}:$.: warning: bad line: $_";
++	++$warnings;
++    }
++}
++
++
++#
++# STATE_PROTO: reading a function/whatever prototype.
++#
++sub process_proto($$) {
++    my $file = shift;
++
++    if (/$doc_inline_oneline/) {
++	$section = $1;
++	$contents = $2;
++	if ($contents ne "") {
++	    $contents .= "\n";
++	    dump_section($file, $section, $contents);
++	    $section = $section_default;
++	    $contents = "";
++	}
++    } elsif (/$doc_inline_start/) {
++	$state = STATE_INLINE;
++	$inline_doc_state = STATE_INLINE_NAME;
++    } elsif ($decl_type eq 'function') {
++	process_proto_function($_, $file);
++    } else {
++	process_proto_type($_, $file);
++    }
++}
++
++#
++# STATE_DOCBLOCK: within a DOC: block.
++#
++sub process_docblock($$) {
++    my $file = shift;
++
++    if (/$doc_end/) {
++	dump_doc_section($file, $section, $contents);
++	$section = $section_default;
++	$contents = "";
++	$function = "";
++	%parameterdescs = ();
++	%parametertypes = ();
++	@parameterlist = ();
++	%sections = ();
++	@sectionlist = ();
++	$prototype = "";
++	$state = STATE_NORMAL;
++    } elsif (/$doc_content/) {
++	if ( $1 eq "" )	{
++	    $contents .= $blankline;
++	} else {
++	    $contents .= $1 . "\n";
++	}
++    }
++}
++
++#
++# STATE_INLINE: docbook comments within a prototype.
++#
++sub process_inline($$) {
++    my $file = shift;
++
++    # First line (state 1) needs to be a @parameter
++    if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
++	$section = $1;
++	$contents = $2;
++	$new_start_line = $.;
++	if ($contents ne "") {
++	    while (substr($contents, 0, 1) eq " ") {
++		$contents = substr($contents, 1);
++	    }
++	    $contents .= "\n";
++	}
++	$inline_doc_state = STATE_INLINE_TEXT;
++	# Documentation block end */
++    } elsif (/$doc_inline_end/) {
++	if (($contents ne "") && ($contents ne "\n")) {
++	    dump_section($file, $section, $contents);
++	    $section = $section_default;
++	    $contents = "";
++	}
++	$state = STATE_PROTO;
++	$inline_doc_state = STATE_INLINE_NA;
++	# Regular text
++    } elsif (/$doc_content/) {
++	if ($inline_doc_state == STATE_INLINE_TEXT) {
++	    $contents .= $1 . "\n";
++	    # nuke leading blank lines
++	    if ($contents =~ /^\s*$/) {
++		$contents = "";
++	    }
++	} elsif ($inline_doc_state == STATE_INLINE_NAME) {
++	    $inline_doc_state = STATE_INLINE_ERROR;
++	    print STDERR "${file}:$.: warning: ";
++	    print STDERR "Incorrect use of kernel-doc format: $_";
++	    ++$warnings;
++	}
++    }
++}
++
++
++sub process_file($) {
++    my $file;
+     my $initial_section_counter = $section_counter;
+     my ($orig_file) = @_;
+-    my $leading_space;
+ 
+     $file = map_filename($orig_file);
+ 
+@@ -1853,250 +2145,23 @@ sub process_file($) {
+ 	}
+ 	# Replace tabs by spaces
+         while ($_ =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {};
++	# Hand this line to the appropriate state handler
+ 	if ($state == STATE_NORMAL) {
+-	    if (/$doc_start/o) {
+-		$state = STATE_NAME;	# next line is always the function name
+-		$in_doc_sect = 0;
+-		$declaration_start_line = $. + 1;
+-	    }
+-	} elsif ($state == STATE_NAME) {# this line is the function name (always)
+-	    if (/$doc_block/o) {
+-		$state = STATE_DOCBLOCK;
+-		$contents = "";
+-                $new_start_line = $. + 1;
+-
+-		if ( $1 eq "" ) {
+-			$section = $section_intro;
+-		} else {
+-			$section = $1;
+-		}
+-	    }
+-	    elsif (/$doc_decl/o) {
+-		$identifier = $1;
+-		if (/\s*([\w\s]+?)\s*-/) {
+-		    $identifier = $1;
+-		}
+-
+-		$state = STATE_FIELD;
+-		# if there's no @param blocks need to set up default section
+-		# here
+-		$contents = "";
+-		$section = $section_default;
+-		$new_start_line = $. + 1;
+-		if (/-(.*)/) {
+-		    # strip leading/trailing/multiple spaces
+-		    $descr= $1;
+-		    $descr =~ s/^\s*//;
+-		    $descr =~ s/\s*$//;
+-		    $descr =~ s/\s+/ /g;
+-		    $declaration_purpose = xml_escape($descr);
+-		    $in_purpose = 1;
+-		} else {
+-		    $declaration_purpose = "";
+-		}
+-
+-		if (($declaration_purpose eq "") && $verbose) {
+-			print STDERR "${file}:$.: warning: missing initial short description on line:\n";
+-			print STDERR $_;
+-			++$warnings;
+-		}
+-
+-		if ($identifier =~ m/^struct/) {
+-		    $decl_type = 'struct';
+-		} elsif ($identifier =~ m/^union/) {
+-		    $decl_type = 'union';
+-		} elsif ($identifier =~ m/^enum/) {
+-		    $decl_type = 'enum';
+-		} elsif ($identifier =~ m/^typedef/) {
+-		    $decl_type = 'typedef';
+-		} else {
+-		    $decl_type = 'function';
+-		}
+-
+-		if ($verbose) {
+-		    print STDERR "${file}:$.: info: Scanning doc for $identifier\n";
+-		}
+-	    } else {
+-		print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
+-		" - I thought it was a doc line\n";
+-		++$warnings;
+-		$state = STATE_NORMAL;
+-	    }
+-	} elsif ($state == STATE_FIELD) {	# look for head: lines, and include content
+-	    if (/$doc_sect/i) { # case insensitive for supported section names
+-		$newsection = $1;
+-		$newcontents = $2;
+-
+-		# map the supported section names to the canonical names
+-		if ($newsection =~ m/^description$/i) {
+-		    $newsection = $section_default;
+-		} elsif ($newsection =~ m/^context$/i) {
+-		    $newsection = $section_context;
+-		} elsif ($newsection =~ m/^returns?$/i) {
+-		    $newsection = $section_return;
+-		} elsif ($newsection =~ m/^\@return$/) {
+-		    # special: @return is a section, not a param description
+-		    $newsection = $section_return;
+-		}
+-
+-		if (($contents ne "") && ($contents ne "\n")) {
+-		    if (!$in_doc_sect && $verbose) {
+-			print STDERR "${file}:$.: warning: contents before sections\n";
+-			++$warnings;
+-		    }
+-		    dump_section($file, $section, xml_escape($contents));
+-		    $section = $section_default;
+-		}
+-
+-		$in_doc_sect = 1;
+-		$in_purpose = 0;
+-		$contents = $newcontents;
+-                $new_start_line = $.;
+-		while (substr($contents, 0, 1) eq " ") {
+-		    $contents = substr($contents, 1);
+-		}
+-		if ($contents ne "") {
+-		    $contents .= "\n";
+-		}
+-		$section = $newsection;
+-		$leading_space = undef;
+-	    } elsif (/$doc_end/) {
+-		if (($contents ne "") && ($contents ne "\n")) {
+-		    dump_section($file, $section, xml_escape($contents));
+-		    $section = $section_default;
+-		    $contents = "";
+-		}
+-		# look for doc_com + <text> + doc_end:
+-		if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
+-		    print STDERR "${file}:$.: warning: suspicious ending line: $_";
+-		    ++$warnings;
+-		}
+-
+-		$prototype = "";
+-		$state = STATE_PROTO;
+-		$brcount = 0;
+-#		print STDERR "end of doc comment, looking for prototype\n";
+-	    } elsif (/$doc_content/) {
+-		# miguel-style comment kludge, look for blank lines after
+-		# @parameter line to signify start of description
+-		if ($1 eq "") {
+-		    if ($section =~ m/^@/ || $section eq $section_context) {
+-			dump_section($file, $section, xml_escape($contents));
+-			$section = $section_default;
+-			$contents = "";
+-                        $new_start_line = $.;
+-		    } else {
+-			$contents .= "\n";
+-		    }
+-		    $in_purpose = 0;
+-		} elsif ($in_purpose == 1) {
+-		    # Continued declaration purpose
+-		    chomp($declaration_purpose);
+-		    $declaration_purpose .= " " . xml_escape($1);
+-		    $declaration_purpose =~ s/\s+/ /g;
+-		} else {
+-		    my $cont = $1;
+-		    if ($section =~ m/^@/ || $section eq $section_context) {
+-			if (!defined $leading_space) {
+-			    if ($cont =~ m/^(\s+)/) {
+-				$leading_space = $1;
+-			    } else {
+-				$leading_space = "";
+-			    }
+-			}
+-
+-			$cont =~ s/^$leading_space//;
+-		    }
+-		    $contents .= $cont . "\n";
+-		}
+-	    } else {
+-		# i dont know - bad line?  ignore.
+-		print STDERR "${file}:$.: warning: bad line: $_";
+-		++$warnings;
+-	    }
++	    process_normal();
++	} elsif ($state == STATE_NAME) {
++	    process_name($file, $_);
++	} elsif ($state == STATE_BODY || $state == STATE_BODY_MAYBE) {
++	    process_body($file, $_);
+ 	} elsif ($state == STATE_INLINE) { # scanning for inline parameters
+-	    # First line (state 1) needs to be a @parameter
+-	    if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
+-		$section = $1;
+-		$contents = $2;
+-                $new_start_line = $.;
+-		if ($contents ne "") {
+-		    while (substr($contents, 0, 1) eq " ") {
+-			$contents = substr($contents, 1);
+-		    }
+-		    $contents .= "\n";
+-		}
+-		$inline_doc_state = STATE_INLINE_TEXT;
+-	    # Documentation block end */
+-	    } elsif (/$doc_inline_end/) {
+-		if (($contents ne "") && ($contents ne "\n")) {
+-		    dump_section($file, $section, xml_escape($contents));
+-		    $section = $section_default;
+-		    $contents = "";
+-		}
+-		$state = STATE_PROTO;
+-		$inline_doc_state = STATE_INLINE_NA;
+-	    # Regular text
+-	    } elsif (/$doc_content/) {
+-		if ($inline_doc_state == STATE_INLINE_TEXT) {
+-		    $contents .= $1 . "\n";
+-		    # nuke leading blank lines
+-		    if ($contents =~ /^\s*$/) {
+-			$contents = "";
+-		    }
+-		} elsif ($inline_doc_state == STATE_INLINE_NAME) {
+-		    $inline_doc_state = STATE_INLINE_ERROR;
+-		    print STDERR "${file}:$.: warning: ";
+-		    print STDERR "Incorrect use of kernel-doc format: $_";
+-		    ++$warnings;
+-		}
+-	    }
+-	} elsif ($state == STATE_PROTO) {	# scanning for function '{' (end of prototype)
+-	    if (/$doc_inline_oneline/) {
+-		$section = $1;
+-		$contents = $2;
+-		if ($contents ne "") {
+-		    $contents .= "\n";
+-		    dump_section($file, $section, xml_escape($contents));
+-		    $section = $section_default;
+-		    $contents = "";
+-		}
+-	    } elsif (/$doc_inline_start/) {
+-		$state = STATE_INLINE;
+-		$inline_doc_state = STATE_INLINE_NAME;
+-	    } elsif ($decl_type eq 'function') {
+-		process_proto_function($_, $file);
+-	    } else {
+-		process_proto_type($_, $file);
+-	    }
++	    process_inline($file, $_);
++	} elsif ($state == STATE_PROTO) {
++	    process_proto($file, $_);
+ 	} elsif ($state == STATE_DOCBLOCK) {
+-		if (/$doc_end/)
+-		{
+-			dump_doc_section($file, $section, xml_escape($contents));
+-			$section = $section_default;
+-			$contents = "";
+-			$function = "";
+-			%parameterdescs = ();
+-			%parametertypes = ();
+-			@parameterlist = ();
+-			%sections = ();
+-			@sectionlist = ();
+-			$prototype = "";
+-			$state = STATE_NORMAL;
+-		}
+-		elsif (/$doc_content/)
+-		{
+-			if ( $1 eq "" )
+-			{
+-				$contents .= $blankline;
+-			}
+-			else
+-			{
+-				$contents .= $1 . "\n";
+-			}
+-		}
++	    process_docblock($file, $_);
+ 	}
+     }
++
++    # Make sure we got something interesting.
+     if ($initial_section_counter == $section_counter) {
+ 	if ($output_mode ne "none") {
+ 	    print STDERR "${file}:1: warning: no structured comments found\n";
+-- 
+2.7.4
+