Date: Thu, 6 May 2004 16:44:42 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Carlos Velasco <freebsd@newipnet.com> Cc: freebsd-mobile@freebsd.org Subject: Re[4]: Modem + Network in Xircom cards, and maybe others Message-ID: <20040506151240.J19057@gamplex.bde.org> In-Reply-To: <200405051746300245.2039F9A4@192.168.128.16> References: <200405021259230046.12648609@192.168.128.16> <200405022224250625.14440A3D@192.168.128.16> <20040505233435.B15444@gamplex.bde.org> <200405051746300245.2039F9A4@192.168.128.16>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 5 May 2004, Carlos Velasco wrote: > On 06/05/2004 at 0:26 Bruce Evans wrote: > > >It seems like a patch for MFC sincd it has mfc's in it (what is a MFC?). > > MFC == Multi Function PCMCIA cards. > FreeBSD has yet support for REAL MFC cards. However Xircom and maybe other > cards don't work as REAL MFC. > Right now only the last function (usually Network function) is the one that > works in these cards with CURRENT. > > I'm patching it to activate both functions (usually modem/serial and > network). > Network is in xe driver, however I'm passing modem to sio. > It works, however sio reports interrupt-level buffer overflows when I'm > above 2400bps, losing characters, and here is where I'm lost. > > >However, you may need only this part of it. This part permits software > >interrupts to be delayed by 38 ticks instead of the expected maximim > >of 2 ticks. I keep forgetting to fix this. Scaling by hz is not quite > >right, because hz may be set to values that are too small to work all > >the time or even most of the time. There is a clamp to 128 (min), but > >this is a bit small. E.g., with hz = 1000 and speed = 115200, the > >original code in the above gives cp4ticks = 44 and ibufsize = 128. If > >hz = 1000 actually worked, then the buffer would be drained every 1 > >msec and would never have more than 12 characters in it, but the > >software interrupt latency is apparently sometimes >= 12 msec so the > >buffer overflows. There are some mii Giant hogs which sometimes delay > >timeout processing for that long or nearly so (each). > > Lost here... I think understand that problem is related to GIANT driver > delaying this, right? It's more a general issue that that. sio's SWI handler[s] need to run often enough. For that, it needs to have high enough priority. Giant just delays things generally. The broken interrupt priorities are easy to see in "ps laxw | sort -n +4" output. Note that the highest priorities are numerically lowest: %%% UID PID PPID CPU PRI NI VSZ RSS MWCHAN STAT TT TIME COMMAND 0 6 0 0 -84 0 0 12 actask IL ?? 0:00.00 (acpi_task0) 0 7 0 0 -84 0 0 12 actask IL ?? 0:00.00 (acpi_task1) 0 8 0 0 -84 0 0 12 actask IL ?? 0:00.00 (acpi_task2) [acpi tasks with high priority above. It's not clear that acpi tasks should have the same high priority as clock interrupt handlers or any other hardware or software interrupt handler. Interrupts generally need to be able to preempt tasks.] 0 12 0 0 -84 0 0 12 - WL ?? 0:00.00 (irq0: clk) 0 19 0 0 -84 0 0 12 - WL ?? 0:00.00 (irq8: rtc) [Bogus ithreads for clock interrupt handlers above. Clock interrupt handlers are fast, so these threads are never used. SInce they are fast, they effectively have higher than the highest priority (sic), so they can interrupt the acpi tasks. Perhaps acpi depends on this.] 0 16 0 0 -68 0 0 12 - WL ?? 0:00.07 (irq5: fxp0) 0 21 0 0 -68 0 0 12 - WL ?? 0:00.00 (irq10: bge0) 0 17 0 0 -64 0 0 12 - WL ?? 0:00.00 (irq6: fdc0) 0 25 0 0 -64 0 0 12 - WL ?? 0:00.01 (irq14: ata0) 0 26 0 0 -64 0 0 12 - WL ?? 0:00.00 (irq15: ata1) 0 13 0 0 -60 0 0 12 - WL ?? 0:00.00 (irq1: atkbd0) [Normal ithreads with correct priorities above.] 0 14 0 0 -60 0 0 12 - WL ?? 0:00.00 (irq3: sio1) 0 15 0 0 -60 0 0 12 - WL ?? 0:00.00 (irq4: sio0) [Bogus ithreads with wrong priorities for serial drivers above. The interrupt handlers are fast, so these threads are never used. If they were used, then their low priority would cause problems.] 0 18 0 0 -60 0 0 12 - WL ?? 0:00.00 (irq7: ppc0) [Another normal ithread above. Its priority is adequate but not quite right. This is for the parallel port, and its interrupt pretends to be for a (slow) tty, but the parallel port is not quite a slow tty and a higher priority interrupt would be better. Hopefully the priority increases when the parallel port is used for PLIP.] 0 22 0 0 -60 0 0 12 - WL ?? 0:00.00 (irq11: cy0) [Another bogus ithread for a serial driver above (bogus as above).] 0 20 0 0 -52 0 0 12 - WL ?? 0:00.00 (irq9: acpi0) [Normal ithread with a dubious priority above. Using the lowest priority for the acpi interrupt doesn't seem to go with using the highest priority for acpi tasks.] 0 27 0 0 -48 0 0 12 - WL ?? 0:00.06 (swi8: tty:cy+ clock) [I think this is supposed to be the low priority softclock ithread (the "slow" cy and sio SWIs attach to it and misname themselves as tty:cy and tty:sio instead of clk:cy and clk:sio). It actually has _highest_ priority among SWIs, so the problem is sort of the opposite of what I thought, but mostly worse. The "slow" cy and sio SWIs actually have the same bogus high priority, so they don't compete with other SWIs. However, they compete with softclock, and all other SWIs have lower priority than softclock so they don't even compete with it. This is the reverse of what is supposed to happen. I think softclock starts with the correct low priority, but its priority gets clobbered when the cy and sio SWIs attach to it. 0 37 0 0 -48 0 0 12 - WL ?? 0:00.00 (swi0: tty:cy+) [I think this is the "fast" cy and sio SWI. Verbose names which get truncated complicate debugging.] 0 29 0 0 -44 0 0 12 - WL ?? 0:00.02 (swi1: net) 0 33 0 0 -40 0 0 12 - WL ?? 0:00.00 (swi2: camnet) 0 34 0 0 -36 0 0 12 - WL ?? 0:00.00 (swi3: cambio) 0 28 0 0 -32 0 0 12 - WL ?? 0:00.00 (swi4: vm) [Finally some examples of SWIs with their indented priorities above.] 0 31 0 0 -28 0 0 12 - WL ?? 0:00.00 (swi5:+) 0 36 0 0 -24 0 0 12 - WL ?? 0:00.00 (swi6:+) [These seem to be unused space wasters for SWI_TQ_FAST and SWI_TQ_GIANT.] 0 23 0 0 -21 0 0 12 - WL ?? 0:00.00 (irq12:) 0 24 0 0 -21 0 0 12 - WL ?? 0:00.00 (irq13:) [Bogus ithreads with weird priorities for unused hardware interrupts above. How did their priorities get to be in the middle of SWI priorities?] 0 32 0 0 -20 0 0 12 - WL ?? 0:00.00 (swi7: acpitaskq) 0 35 0 0 -20 0 0 12 - WL ?? 0:00.00 (swi7: task queue) [Nearly lowest priority SWIs above. The priority seems a little low for acpi, as above. It's not clear whether the generic SWI task queue should have lowest, highest or average SWI priority. [softclock is suppose to be here with lowest SWI priority -16.] %%% > I believe this patch to sio.c is only a temporary solution that should be > removed when GIANT dissapears in most drivers, am I right? No, it (the cp4ticks one) is a more general patch, though it is temporary because it is not in its final form. Best-case interrupt latency cannot be guaranteed for SWIs, and even a saftey margin of a factor of 4 is not enough even without the Giant and priority bugs, since it doesn't scale right when "hz" is configured to large values, and configuring "hz" to too-large values is now encouraged by DEVICE_POLLING. > >sio's software interrupt[s] should have a priority higher than timeouts, > >but sio now has 2 software interrupts with one of them having the same > >low priority as timeouts. This priority should work (in fact, old > >versions of sio just use timeouts), but in RELENG_4 the priority is > >much higher than that as a side effect of having only only the correct > >number of SWIs (1). RELENG_4 may now depend on this. > > Sorry, totally lost here. > Maybe problem is here? > sio4: <Xircom CreditCard Ethernet 10/100 + Modem 56> at port 0x2e8-0x2ef > irq 11 function 0 config 39 on pccard0 > sio4: type 16550A > sio4: unable to activate interrupt in fast mode - using normal mode > > Interrupt is in normal mode that has not a high priority? That;s a different problem and not the one here. Hardware interrupts must be working well enough or else you would get silo overflows instead of interrupt-level buffer overflows. > I don't know why sio activate interrupt in normal mode and can't do it in > fast, though. It is because fast interrupts are not supported at the pccard level or on the same irq as a non-fast interrupt. Multi-function pccards probably cause both problems. The problem corresponding to the first for interrupts layered under puc is hacked around by forcing fast interrupts using PUC_FASTINTR. This only works if all interrupts under puc are fast. pccard is more complicated and handles more devices, so a similar hack would work less well. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040506151240.J19057>