From b78d7a16270eb44c0dc8d4f22c6a38215214e2a3 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Tue, 9 Sep 2008 17:13:27 +0000 Subject: xpp-zaptel: Bugfix: Display data_high in /proc/xpp/*/chipregs: * This byte wasn't shown even if do_datah bit was set. * Also converged all terminology to "sub-register" and not "indirect" * Changed accordingly '[WR]I' to [WR]S' in code. * Still allow usage of '[WR]I' but with deprecation NOTICE() * Convert init_card_* scripts * Adapt show_regs and write_regs script accordingly. * Leave FXS internal macros with ...INDIRECT... because that's the terminology of the SLIC. * You should use both the newer driver and init script. Specifically: newer init script will fail to work with older BRI and FXS xpp driver loaded. From xpp rev. 6117. Merged revisions 4520 via svnmerge from http://svn.digium.com/svn/zaptel/branches/1.2 git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@4531 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- kernel/xpp/card_global.c | 41 +++++++--- kernel/xpp/init_card_1_30 | 200 +++++++++++++++++++++++----------------------- kernel/xpp/init_card_2_30 | 8 +- kernel/xpp/init_card_3_30 | 8 +- 4 files changed, 136 insertions(+), 121 deletions(-) diff --git a/kernel/xpp/card_global.c b/kernel/xpp/card_global.c index beb0fb1..d3a7a66 100644 --- a/kernel/xpp/card_global.c +++ b/kernel/xpp/card_global.c @@ -46,6 +46,8 @@ static int proc_xpd_register_read(char *page, char **start, off_t off, int count unsigned long flags; xpd_t *xpd = data; reg_cmd_t *info; + bool do_datah; + char datah_str[50]; if(!xpd) return -ENODEV; @@ -54,16 +56,26 @@ static int proc_xpd_register_read(char *page, char **start, off_t off, int count len += sprintf(page + len, "# Writing bad data into this file may damage your hardware!\n"); len += sprintf(page + len, "# Consult firmware docs first\n"); len += sprintf(page + len, "#\n"); + do_datah = REG_FIELD(info, do_datah) ? 1 : 0; + if(do_datah) { + snprintf(datah_str, ARRAY_SIZE(datah_str), "\t%02X", + REG_FIELD(info, data_high)); + } else + datah_str[0] = '\0'; if(REG_FIELD(info, do_subreg)) { - len += sprintf(page + len, "#CH\tOP\tReg.\tSub\tDL\n"); - len += sprintf(page + len, "%2d\tRS\t%02X\t%02X\t%02X\n", + len += sprintf(page + len, "#CH\tOP\tReg.\tSub\tDL%s\n", + (do_datah) ? "\tDH" : ""); + len += sprintf(page + len, "%2d\tRS\t%02X\t%02X\t%02X%s\n", info->portnum, - REG_FIELD(info, regnum), REG_FIELD(info, subreg), REG_FIELD(info, data_low)); + REG_FIELD(info, regnum), REG_FIELD(info, subreg), + REG_FIELD(info, data_low), datah_str); } else { - len += sprintf(page + len, "#CH\tOP\tReg.\tDL\n"); - len += sprintf(page + len, "%2d\tRD\t%02X\t%02X\n", + len += sprintf(page + len, "#CH\tOP\tReg.\tDL%s\n", + (do_datah) ? "\tDH" : ""); + len += sprintf(page + len, "%2d\tRD\t%02X\t%02X%s\n", info->portnum, - REG_FIELD(info, regnum), REG_FIELD(info, data_low)); + REG_FIELD(info, regnum), + REG_FIELD(info, data_low), datah_str); } spin_unlock_irqrestore(&xpd->lock, flags); if (len <= off+count) @@ -96,7 +108,7 @@ static int execute_chip_command(xpd_t *xpd, const int argc, char *argv[]) bool writing; int op; /* [W]rite, [R]ead */ int addr_mode; /* [D]irect, [I]ndirect, [Mm]ulti */ - bool do_indirect = 0; + bool do_subreg = 0; int regnum; int subreg; int data_low; @@ -148,12 +160,15 @@ static int execute_chip_command(xpd_t *xpd, const int argc, char *argv[]) addr_mode = argv[argno][1]; switch(addr_mode) { case 'I': - do_indirect = 1; + XPD_NOTICE(xpd, "'I' is deprecated in register commands. Use 'S' instead.\n"); + /* fall through */ + case 'S': + do_subreg = 1; num_args += 2; /* register + subreg */ - //XPD_DBG(REGS, xpd, "INDIRECT\n"); + //XPD_DBG(REGS, xpd, "SUBREG\n"); break; case 'D': - do_indirect = 0; + do_subreg = 0; num_args++; /* register */ //XPD_DBG(REGS, xpd, "DIRECT\n"); break; @@ -206,7 +221,7 @@ static int execute_chip_command(xpd_t *xpd, const int argc, char *argv[]) } //XPD_DBG(REGS, xpd, "Register is %X\n", regnum); argno++; - if(do_indirect) { + if(do_subreg) { if(argno >= argc) { XPD_ERR(xpd, "Missing subregister number\n"); goto out; @@ -261,14 +276,14 @@ static int execute_chip_command(xpd_t *xpd, const int argc, char *argv[]) portno, /* portno */ writing, /* writing */ regnum, - do_indirect, /* use subreg */ + do_subreg, /* use subreg */ subreg, /* subreg */ data_low, do_datah, /* use data_high*/ data_high); #endif ret = xpp_register_request(xpd->xbus, xpd, portno, - writing, regnum, do_indirect, subreg, + writing, regnum, do_subreg, subreg, data_low, do_datah, data_high, 1); out: return ret; diff --git a/kernel/xpp/init_card_1_30 b/kernel/xpp/init_card_1_30 index 68a6d02..11c4cb5 100755 --- a/kernel/xpp/init_card_1_30 +++ b/kernel/xpp/init_card_1_30 @@ -29,12 +29,12 @@ use strict; # accept settings for ALL SLICS). # 2. Command word: # - RD Read Direct register. -# - RI Read Indirect register. +# - RS Read Sub-register. # - WD Write Direct register. -# - WI Write Indirect register. +# - WS Write Sub-register. # 3. Register number in hexadecimal. -# 4. Low data byte in hexadecimal. (for WD and WI commands). -# 5. High data byte in hexadecimal. (for WI command only). +# 4. Low data byte in hexadecimal. (for WD and WS commands). +# 5. High data byte in hexadecimal. (for WS command only). # # @@ -146,7 +146,7 @@ sub read_reg($$$) { close(SLICS); die("Failed reading from '$chipregs' ($read_slic,$read_reg,$direct)") unless @reply; - if ($direct eq 'I') { + if ($direct eq 'S') { return @reply; } else { return $reply[0]; @@ -163,7 +163,7 @@ sub write_reg{#($$$$$) { my $str = sprintf "%s W%s %02X %02X", $read_slic, $direct, $read_reg, $reg_val_low; - if ($direct eq 'I') { + if ($direct eq 'S') { $str .= sprintf " %02X", $reg_val_hi; } write_to_slic_file($str); @@ -181,72 +181,72 @@ sub log_calib_params() { sub init_indirect_registers() { return write_to_slic_file("# -* WI 1E 00 C2 55 -* WI 1E 01 E6 51 -* WI 1E 02 85 4B -* WI 1E 03 37 49 +* WS 1E 00 C2 55 +* WS 1E 01 E6 51 +* WS 1E 02 85 4B +* WS 1E 03 37 49 -* WI 1E 04 33 33 -* WI 1E 05 02 02 -* WI 1E 06 02 02 -* WI 1E 07 98 01 +* WS 1E 04 33 33 +* WS 1E 05 02 02 +* WS 1E 06 02 02 +* WS 1E 07 98 01 -* WI 1E 08 98 01 -* WI 1E 09 11 06 -* WI 1E 0A 02 02 -* WI 1E 0B E5 00 +* WS 1E 08 98 01 +* WS 1E 09 11 06 +* WS 1E 0A 02 02 +* WS 1E 0B E5 00 -* WI 1E 0C 1C 0A -* WI 1E 0D 30 7B -* WI 1E 0E 63 00 -* WI 1E 0F 00 00 +* WS 1E 0C 1C 0A +* WS 1E 0D 30 7B +* WS 1E 0E 63 00 +* WS 1E 0F 00 00 -* WI 1E 10 70 78 -* WI 1E 11 7D 00 -* WI 1E 12 00 00 -* WI 1E 13 00 00 +* WS 1E 10 70 78 +* WS 1E 11 7D 00 +* WS 1E 12 00 00 +* WS 1E 13 00 00 -* WI 1E 14 F0 7E -* WI 1E 15 C0 01 -* WI 1E 16 00 00 -* WI 1E 17 00 20 +* WS 1E 14 F0 7E +* WS 1E 15 C0 01 +* WS 1E 16 00 00 +* WS 1E 17 00 20 -* WI 1E 18 00 20 -* WI 1E 19 00 00 -* WI 1E 1A 00 20 -* WI 1E 1B 00 40 +* WS 1E 18 00 20 +* WS 1E 19 00 00 +* WS 1E 1A 00 20 +* WS 1E 1B 00 40 -* WI 1E 1C 00 10 -* WI 1E 1D 00 36 -* WI 1E 1E 00 10 -* WI 1E 1F 00 02 +* WS 1E 1C 00 10 +* WS 1E 1D 00 36 +* WS 1E 1E 00 10 +* WS 1E 1F 00 02 -* WI 1E 20 C0 07 -* WI 1E 21 00 26 -* WI 1E 22 F4 0F -* WI 1E 23 00 80 - -#* WI 1E 24 20 03 -#* WI 1E 25 8C 08 -#* WI 1E 26 00 01 -#* WI 1E 27 10 00 +* WS 1E 20 C0 07 +* WS 1E 21 00 26 +* WS 1E 22 F4 0F +* WS 1E 23 00 80 + +#* WS 1E 24 20 03 +#* WS 1E 25 8C 08 +#* WS 1E 26 00 01 +#* WS 1E 27 10 00 -* WI 1E 24 00 08 -* WI 1E 25 00 08 -* WI 1E 26 00 08 -* WI 1E 27 00 08 +* WS 1E 24 00 08 +* WS 1E 25 00 08 +* WS 1E 26 00 08 +* WS 1E 27 00 08 -* WI 1E 28 00 0C -* WI 1E 29 00 0C -* WI 1E 2B 00 01 +* WS 1E 28 00 0C +* WS 1E 29 00 0C +* WS 1E 2B 00 01 -* WI 1E 63 DA 00 -* WI 1E 64 60 6B -* WI 1E 65 74 00 -* WI 1E 66 C0 79 +* WS 1E 63 DA 00 +* WS 1E 64 60 6B +* WS 1E 65 74 00 +* WS 1E 66 C0 79 -* WI 1E 67 20 11 -* WI 1E 68 E0 3B +* WS 1E 67 20 11 +* WS 1E 68 E0 3B #"); } @@ -265,8 +265,8 @@ sub save_indirect_filter_params() { for my $slic (@SlicNums) { for my $reg (35 .. 39) { $FilterParams[$slic][$reg] = - [read_reg($slic, $reg, 'I')]; - write_reg($slic, $reg, 'I', 0, 0x80); + [read_reg($slic, $reg, 'S')]; + write_reg($slic, $reg, 'S', 0, 0x80); } } @@ -275,7 +275,7 @@ sub save_indirect_filter_params() { sub restore_indirect_filter_params() { for my $slic (@SlicNums) { for my $reg (35 .. 39) { - write_reg($slic, $reg, 'I', + write_reg($slic, $reg, 'S', @{$FilterParams[$slic][$reg]}); } } @@ -425,35 +425,35 @@ __DATA__ * WD 40 00 # Flush out energy accumulators -* WI 1E 58 00 00 -* WI 1E 59 00 00 -* WI 1E 5A 00 00 -* WI 1E 5B 00 00 -* WI 1E 5C 00 00 -* WI 1E 5D 00 00 -* WI 1E 5E 00 00 -* WI 1E 5F 00 00 -* WI 1E 61 00 00 -* WI 1E 58 00 00 -* WI 1E C1 00 00 -* WI 1E C2 00 00 -* WI 1E C3 00 00 -* WI 1E C4 00 00 -* WI 1E C5 00 00 -* WI 1E C6 00 00 -* WI 1E C7 00 00 -* WI 1E C8 00 00 -* WI 1E C9 00 00 -* WI 1E CA 00 00 -* WI 1E CB 00 00 -* WI 1E CC 00 00 -* WI 1E CD 00 00 -* WI 1E CE 00 00 -* WI 1E CF 00 00 -* WI 1E D0 00 00 -* WI 1E D1 00 00 -* WI 1E D2 00 00 -* WI 1E D3 00 00 +* WS 1E 58 00 00 +* WS 1E 59 00 00 +* WS 1E 5A 00 00 +* WS 1E 5B 00 00 +* WS 1E 5C 00 00 +* WS 1E 5D 00 00 +* WS 1E 5E 00 00 +* WS 1E 5F 00 00 +* WS 1E 61 00 00 +* WS 1E 58 00 00 +* WS 1E C1 00 00 +* WS 1E C2 00 00 +* WS 1E C3 00 00 +* WS 1E C4 00 00 +* WS 1E C5 00 00 +* WS 1E C6 00 00 +* WS 1E C7 00 00 +* WS 1E C8 00 00 +* WS 1E C9 00 00 +* WS 1E CA 00 00 +* WS 1E CB 00 00 +* WS 1E CC 00 00 +* WS 1E CD 00 00 +* WS 1E CE 00 00 +* WS 1E CF 00 00 +* WS 1E D0 00 00 +* WS 1E D1 00 00 +* WS 1E D2 00 00 +* WS 1E D3 00 00 # Setting of SLICs offsets # New card initialization @@ -503,16 +503,16 @@ __DATA__ * WD 6C 01 -* WI 1E 23 00 80 -* WI 1E 24 20 03 -* WI 1E 25 8C 08 -* WI 1E 26 00 01 -* WI 1E 27 10 00 +* WS 1E 23 00 80 +* WS 1E 24 20 03 +* WS 1E 25 8C 08 +* WS 1E 26 00 01 +* WS 1E 27 10 00 #------ Metering tone -* WI 1E 17 61 15 # Amplitue Ramp-up -* WI 1E 18 61 15 # Max Amplitude -* WI 1E 19 FB 30 # Frequency +* WS 1E 17 61 15 # Amplitue Ramp-up +* WS 1E 18 61 15 # Max Amplitude +* WS 1E 19 FB 30 # Frequency * WD 2C 00 # Timer dL * WD 2D 03 # Timer dH diff --git a/kernel/xpp/init_card_2_30 b/kernel/xpp/init_card_2_30 index e2d5faa..4a27047 100755 --- a/kernel/xpp/init_card_2_30 +++ b/kernel/xpp/init_card_2_30 @@ -29,12 +29,12 @@ use strict; # accept settings for ALL SLICS). # 2. Command word: # - RD Read Direct register. -# - RI Read Indirect register. +# - RS Read Sub-register. # - WD Write Direct register. -# - WI Write Indirect register. +# - WS Write Sub-register. # 3. Register number in hexadecimal. -# 4. Low data byte in hexadecimal. (for WD and WI commands). -# 5. High data byte in hexadecimal. (for WI command only). +# 4. Low data byte in hexadecimal. (for WD and WS commands). +# 5. High data byte in hexadecimal. (for WS command only). # # diff --git a/kernel/xpp/init_card_3_30 b/kernel/xpp/init_card_3_30 index 3a605e3..cbcd550 100755 --- a/kernel/xpp/init_card_3_30 +++ b/kernel/xpp/init_card_3_30 @@ -43,12 +43,12 @@ use strict; # 1. CHIP select in decimal (ignored, taken from 3 LSB's of subunit number) # 2. Command word: # - RD Read Direct register. -# - RI Read Indirect register. +# - RS Read Sub-register. # - WD Write Direct register. -# - RI Write Indirect register. +# - WS Write Sub-register. # 3. Register number in hexadecimal. -# 4. Subregister number in hexadecimal. (for RI and WI commands). -# 5. Data byte in hexadecimal. (for WD and WI commands only). +# 4. Subregister number in hexadecimal. (for RS and WS commands). +# 5. Data byte in hexadecimal. (for WD and WS commands only). # package main; -- cgit v1.2.3