move wlcompat to the broadcom-wl package
[openwrt/staging/mkresin.git] / package / broadcom-wl / src / driver / patchtable.pl
diff --git a/package/broadcom-wl/src/driver/patchtable.pl b/package/broadcom-wl/src/driver/patchtable.pl
new file mode 100644 (file)
index 0000000..6999735
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2006 OpenWrt.org
+# Copyright (C) 2006 Felix Fietkau
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+use strict;
+
+my $TABLE = pack("V", 0xbadc0ded);
+my $TABLE_SIZE = 512;
+my $SLT1 = "\x01\x00\x00\x00";
+my $SLT2 = "\x02\x00\x00\x00";
+my $ACKW = "\x03\x00\x00\x00";
+my $PTABLE_END = "\xff\xff\xff\xff";
+
+my $addr = "";
+my $opcode = "";
+my $function = "";
+
+sub add_entry {
+       my $key = shift;
+       my $value = shift;
+       my $default = shift;
+
+       $TABLE .= $key;
+       $TABLE .= pack("V", $value);
+       $TABLE .= pack("V", $default);
+}
+
+while (<>) {
+       $addr = $opcode = "";
+       /^\w{8}\s*<(.*)>:$/ and $function = $1;
+       /^\s*(\w+):\s*(\w{8})\s*/ and do {
+               $addr = $1;
+               $opcode = $2;
+       };
+
+       ($function eq 'wlc_update_slot_timing') and do {
+               # li    a2,9    -- short slot time
+               ($opcode eq '24060009') and add_entry($SLT1, hex($addr), hex($opcode));
+               # li    v0,519  -- 510 + short slot time
+               ($opcode eq '24020207') and add_entry($SLT2, hex($addr), hex($opcode));
+               
+               # li    a2,20   -- long slot time
+               ($opcode eq '24060014') and add_entry($SLT1, hex($addr), hex($opcode));
+               # li    v0,530  -- 510 + long slot time
+               ($opcode eq '24020212') and add_entry($SLT2, hex($addr), hex($opcode));
+       };
+       ($function eq 'wlc_d11hdrs') and do {
+               # ori   s6,s6,0x1 -- ack flag (new)
+               ($opcode eq '36d60001') and add_entry($ACKW, hex($addr), hex($opcode));
+               # ori   s3,s3,0x1 -- ack flag (old)
+               ($opcode eq '36730001') and add_entry($ACKW, hex($addr), hex($opcode));
+       }
+}
+
+$TABLE .= $PTABLE_END;
+$TABLE .= ("\x00" x ($TABLE_SIZE - length($TABLE)));
+print $TABLE;