On Donnerstag 09 Juni 2005 13:09, Dr. Werner Fink wrote: > I've a firmware ready which will allow abort the > OSDSetBlock command during loading the data with > the command ReleaseBmp. Would it be safe if OSDSetBlock always calls ReleaseBmp at the end? Or should it only do so after success or -ERESTARTSYS? The latter is what I coded for now. I suppose for FW before 261e ReleaseBmp should only be called on success with the code below and your firmware from yesterday I now get this, looks fine I think. If you think the code is correct like this I will produce a new patch. Jun 10 13:42:45 mm vdr[28938]: switching to channel 2 Jun 10 13:42:45 mm vdr[29114]: receiver on device 1 thread started (pid=29114, tid=213000) Jun 10 13:42:45 mm kernel: dvb-ttpci: OSDSetBlock(): returns -512 Jun 10 13:42:45 mm kernel: dvb-ttpci: ReleaseBitmap(): ReleaseBitmap called while BMP_LOADING Jun 10 13:42:45 mm kernel: dvb-ttpci: av7110_osd_cmd(): av7110_osd_cmd(13) returns with -ERESTARTSYS Jun 10 13:42:45 mm vdr[29113]: transfer thread started (pid=29113, tid=196615) btw if I change the channel via OSD channel menu no ERESTARTSYS ever happens. Strange. With the previous fw I got this while replaying a DolbySurround recording (ARD Nachtkonzert): Jun 10 13:53:58 mm kernel: av7110_fw_request: timeout waiting for COMMAND to complete Jun 10 13:53:58 mm kernel: dvb-ttpci: StartHWFilter error buf 0b07 0010 044c b96a ret ffffff92 handle c042 Jun 10 13:53:58 mm kernel: StopHWFilter tried to stop invalid filter ffff, filter type = 1 Now these messages don't come anymore but the problem (dropouts) is still exactly the same, maybe a little less often. I just got this driver buffer overflow while watching ZDF with Dolby Digital, never saw it before: Jun 10 13:43:00 mm vdr[28947]: changing transponder data of channel 1718 from S19.2E:12825:v:27500:3 to S19.2E:12285:v:27500:3 Jun 10 13:45:22 mm vdr[29115]: ERROR: driver buffer overflow on device 1 Jun 10 13:47:28 mm vdr[28938]: switching to channel 3 Jun 10 13:47:28 mm vdr[29113]: transfer thread ended (pid=29113, tid=196615) Jun 10 13:47:29 mm vdr[29115]: TS buffer on device 1 thread ended (pid=29115, tid=229385) Jun 10 13:47:29 mm vdr[29114]: buffer stats: 91932 (4%) used Jun 10 13:47:29 mm vdr[29114]: receiver on device 1 thread ended (pid=29114, tid=213000) Jun 10 13:47:29 mm vdr[28938]: cTS2PES got 0 TS errors, 1 TS continuity errors static inline int ReleaseBitmap(struct av7110 *av7110) { dprintk(4, "%p\n", av7110); if (av7110->bmp_state != BMP_LOADED && FW_VERSION(av7110->arm_app) < 0x261e) return -1; av7110->bmp_state = BMP_NONE; return av7110_fw_cmd(av7110, COMTYPE_OSD, ReleaseBmp, 0); } static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, int x1, int y1, int inc, u8 __user * data) { uint w, h, bpp, bpl, size, lpb, bnum, brest; int i; int rc; w = x1 - x0 + 1; h = y1 - y0 + 1; if (inc <= 0) inc = w; if (w <= 0 || w > 720 || h <= 0 || h > 576) return -EINVAL; bpp = av7110->osdbpp[av7110->osdwin] + 1; bpl = ((w * bpp + 7) & ~7) / 8; size = h * bpl; lpb = (32 * 1024) / bpl; bnum = size / (lpb * bpl); brest = size - bnum * lpb * bpl; if (av7110->bmp_state == BMP_LOADING) { /* possible if syscall is repeated by -ERESTARTSYS and if firmware cannot abort */ BUG_ON (FW_VERSION(av7110->arm_app) >= 0x261e); rc = WaitUntilBmpLoaded(av7110); if (rc) return rc; /* just continue. This should work for older fw versions * if bnum==1 && !brest && (LoadBitmap was successful) */ } rc = 0; for (i = 0; i < bnum; i++) { rc = LoadBitmap(av7110, w, lpb, inc, data); if (rc) break; rc = BlitBitmap(av7110, x0, y0 + i * lpb); if (rc) break; data += lpb * inc; } if (!rc && brest) { rc = LoadBitmap(av7110, w, brest / bpl, inc, data); if (!rc) rc = BlitBitmap(av7110, x0, y0 + bnum * lpb); } if (rc) dprintk(1,"returns %d\n",rc); if (!rc || FW_VERSION(av7110->arm_app) >= 0x261e) { int relrc = ReleaseBitmap(av7110); if (rc!=-ERESTARTSYS) rc = relrc; } return rc; } -- Wolfgang