On Sep 24, 2010, at 9:43 PM, Arjen de Korte wrote:
> Citeren "Brian R. Smith" <[email protected]>:
>
>> Should megatec_usb.c/set_data_krauler just skip the "usb" subdriver function
>> table and go straight for usb_get_string? Or should the usb subdriver be
>> extended with a call that doesn't go through usb_get_string_simple?
>
> The 'megatec_usb' driver is no longer maintained and has been replaced by the
> 'blazer_usb' driver. This uses direct calls to the libusb library, so the fix
> you recommend should be much easier to implement. Please post some debug
> output before and after making these changes by running the driver with -DDD
> enabled (not more).
Ah, thanks for that. Yes, blazer_usb is a better place for the change. Sorry
I didn't notice it earlier.
Here's debug output, from before:
====================================================================
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
0.000000 debug level is '3'
0.118093 Checking device (1D6B/0001) (005/001)
0.118164 - VendorID: 1d6b
0.118177 - ProductID: 0001
0.118188 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118199 - Product: UHCI Host Controller
0.118209 - Serial Number: 0000:00:1d.3
0.118220 - Bus: 005
0.118230 Trying to match device
0.118256 Device does not match - skipping
0.118273 Checking device (1D6B/0001) (004/001)
0.118317 - VendorID: 1d6b
0.118328 - ProductID: 0001
0.118339 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118350 - Product: UHCI Host Controller
0.118362 - Serial Number: 0000:00:1d.2
0.118372 - Bus: 004
0.118383 Trying to match device
0.118395 Device does not match - skipping
0.118411 Checking device (1D6B/0001) (003/001)
0.118453 - VendorID: 1d6b
0.118465 - ProductID: 0001
0.118476 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118487 - Product: UHCI Host Controller
0.118498 - Serial Number: 0000:00:1d.1
0.118508 - Bus: 003
0.118519 Trying to match device
0.118531 Device does not match - skipping
0.118546 Checking device (0001/0000) (002/002)
0.124522 - VendorID: 0001
0.124540 - ProductID: 0000
0.124550 - Manufacturer: unknown
0.124561 - Product: unknown
0.124572 - Serial Number: unknown
0.124583 - Bus: 002
0.124594 Trying to match device
0.124633 Device matches
0.127542 Trying megatec protocol...
0.127559 send: Q1
0.130530 read: error sending control message: Broken pipe
0.133511 Stall condition cleared
0.133523 blazer_status: short reply
0.133536 Status read 1 failed
0.133547 send: Q1
0.149536 read: error sending control message: Broken pipe
0.152559 Stall condition cleared
0.152600 blazer_status: short reply
0.152617 Status read 2 failed
0.152634 send: Q1
0.155557 read: error sending control message: Broken pipe
0.158531 Stall condition cleared
0.158553 blazer_status: short reply
0.158565 Status read 3 failed
0.158576 Trying mustek protocol...
0.158587 send: QS
0.158599 read: QS
0.158609 blazer_status: short reply
0.158620 Status read 1 failed
0.158631 send: QS
0.158641 read: QS
0.158652 blazer_status: short reply
0.158663 Status read 2 failed
0.158674 send: QS
0.158685 read: QS
0.158696 blazer_status: short reply
0.158707 Status read 3 failed
0.158717 Trying megatec/old protocol...
0.158728 send: D
0.158738 read: D
0.158749 blazer_status: short reply
0.158760 Status read 1 failed
0.158771 send: D
0.158781 read: D
0.158792 blazer_status: short reply
0.158803 Status read 2 failed
0.158814 send: D
0.158824 read: D
0.158835 blazer_status: short reply
0.158846 Status read 3 failed
0.158857 No supported UPS detected
====================================================================
And after:
====================================================================
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
0.000000 debug level is '3'
0.118088 Checking device (1D6B/0001) (005/001)
0.118160 - VendorID: 1d6b
0.118172 - ProductID: 0001
0.118182 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118193 - Product: UHCI Host Controller
0.118204 - Serial Number: 0000:00:1d.3
0.118219 - Bus: 005
0.118232 Trying to match device
0.118257 Device does not match - skipping
0.118275 Checking device (1D6B/0001) (004/001)
0.118319 - VendorID: 1d6b
0.118331 - ProductID: 0001
0.118342 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118353 - Product: UHCI Host Controller
0.118364 - Serial Number: 0000:00:1d.2
0.118374 - Bus: 004
0.118385 Trying to match device
0.118397 Device does not match - skipping
0.118413 Checking device (1D6B/0001) (003/001)
0.118455 - VendorID: 1d6b
0.118467 - ProductID: 0001
0.118477 - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
0.118488 - Product: UHCI Host Controller
0.118499 - Serial Number: 0000:00:1d.1
0.118510 - Bus: 003
0.118520 Trying to match device
0.118532 Device does not match - skipping
0.118548 Checking device (0001/0000) (002/002)
0.124095 - VendorID: 0001
0.124115 - ProductID: 0000
0.124126 - Manufacturer: unknown
0.124136 - Product: unknown
0.124147 - Serial Number: unknown
0.124158 - Bus: 002
0.124168 Trying to match device
0.124208 Device matches
0.127113 Trying megatec protocol...
0.127131 send: Q1
0.133087 blazer_status: short reply
0.133104 Status read 1 failed
0.133116 send: Q1
0.414304 Status read in 2 tries
0.414328 Supported UPS detected with megatec protocol
0.414340 send: F
0.571288 Ratings read in 1 tries
0.571313 send: I
0.774349 Vendor information read in 1 tries
0.774377 Battery runtime will not be calculated (runtimecal not set)
0.774402 send: Q1
1.054571 dstate_init: sock /var/state/ups/blazer_usb-DynamixUPS open on
fd 5
1.054609 send: Q1
1.059418 read: timeout
1.059432 blazer_status: short reply
1.059444 Communications with UPS lost: status read failed!
3.056628 send: Q1
3.336276 Communications with UPS re-established
5.058367 send: Q1
7.060107 send: Q1
7.064567 read: timeout
7.064582 blazer_status: short reply
7.064593 Communications with UPS lost: status read failed!
9.062118 send: Q1
9.342426 Communications with UPS re-established
11.062258 send: Q1
13.063998 send: Q1
15.065761 send: Q1
17.067520 send: Q1
17.072148 read: timeout
17.072163 blazer_status: short reply
17.072175 Communications with UPS lost: status read failed!
19.069533 send: Q1
19.326997 Communications with UPS re-established
21.071296 send: Q1
23.073059 send: Q1
25.074820 send: Q1
27.076584 send: Q1
29.078351 send: Q1
31.080117 send: Q1
33.081884 send: Q1
35.083655 send: Q1
37.085429 send: Q1
39.087206 send: Q1
41.088984 send: Q1
43.090759 send: Q1
43.339563 blazer_status: non numerical value [27.0]
45.092528 send: Q1
47.094300 send: Q1
49.096050 send: Q1
51.097802 send: Q1
53.099556 send: Q1
55.101309 send: Q1
57.103065 send: Q1
57.107474 read: timeout
57.107489 blazer_status: short reply
57.107501 Communications with UPS lost: status read failed!
59.105087 send: Q1
59.391341 Communications with UPS re-established
61.106825 send: Q1
^C 63.022253 Signal 2: exiting
====================================================================
The communication gets lost/restored often, but it works.
The diffs aren't complicated - it's the guts of usb_get_string_simple
repurposed:
====================================================================
*** blazer_usb.c.orig 2010-02-12 10:43:23.000000000 +1300
--- blazer_usb.c 2010-09-25 13:43:09.523546405 +1200
***************
*** 233,238 ****
--- 233,239 ----
};
int i;
+ char tbuf[255]; /* Some devices choke on size > 255 */
upsdebugx(3, "send: %.*s", (int)strcspn(cmd, "\r"), cmd);
***************
*** 244,257 ****
}
for (retry = 0; retry < 10; retry++) {
! int ret;
!
! ret = usb_get_string_simple(udev, command[i].index,
buf, buflen);
if (ret <= 0) {
upsdebugx(3, "read: %s", ret ? usb_strerror() :
"timeout");
return ret;
}
/* "UPS No Ack" has a special meaning */
if (!strcasecmp(buf, "UPS No Ack")) {
--- 245,279 ----
}
for (retry = 0; retry < 10; retry++) {
! int ret, di, si;
!
! //ret = usb_get_string_simple(udev, command[i].index,
buf, buflen);
! // Most of the guts of usb_get_string_simple, but
eliminated
! // request for languages - seems to confuse stoopid UPS
! ret = usb_get_string(udev, command[i].index, 0x0409,
tbuf, sizeof(tbuf));
if (ret <= 0) {
upsdebugx(3, "read: %s", ret ? usb_strerror() :
"timeout");
return ret;
}
+ if (tbuf[1] != USB_DT_STRING)
+ return -EIO;
+
+ if (tbuf[0] > ret)
+ return -EFBIG;
+
+ for (di = 0, si = 2; si < tbuf[0]; si += 2)
+ {
+ if (di >= (buflen - 1))
+ break;
+
+ if (tbuf[si + 1]) /* high byte */
+ buf[di++] = '?';
+ else
+ buf[di++] = tbuf[si];
+ }
+
+ buf[di] = 0;
/* "UPS No Ack" has a special meaning */
if (!strcasecmp(buf, "UPS No Ack")) {
====================================================================
Take care,
--
Brian R. Smith
[email protected]
_______________________________________________
Nut-upsdev mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/nut-upsdev