Commit Graph

80 Commits

Author SHA1 Message Date
Michael Brown
dbe84c5aad [iobuf] Add iob_disown() and use it where it simplifies code
There are many functions that take ownership of the I/O buffer they
are passed as a parameter.  The caller should not retain a pointer to
the I/O buffer.  Use iob_disown() to automatically nullify the
caller's pointer, e.g.:

    xfer_deliver_iob ( xfer, iob_disown ( iobuf ) );

This will ensure that iobuf is set to NULL for any code after the call
to xfer_deliver_iob().

iob_disown() is currently used only in places where it simplifies the
code, by avoiding an extra line explicitly setting the I/O buffer
pointer to NULL.  It should ideally be used with each call to any
function that takes ownership of an I/O buffer.  (The SSA
optimisations will ensure that use of iob_disown() gets optimised away
in cases where the caller makes no further use of the I/O buffer
pointer anyway.)

If gcc ever introduces an __attribute__((free)), indicating that use
of a function argument after a function call should generate a
warning, then we should use this to identify all applicable function
call sites, and add iob_disown() as necessary.
2009-02-01 20:16:10 +00:00
Michael Brown
b59e0cc56e [i386] Change [u]int32_t to [unsigned] int, rather than [unsigned] long
This brings us in to line with Linux definitions, and also simplifies
adding x86_64 support since both platforms have 2-byte shorts, 4-byte
ints and 8-byte long longs.
2008-11-19 19:15:44 +00:00
Michael Brown
6554b79ff9 [uaccess] Formalise the uaccess API
The userptr_t is now the fundamental type that gets used for conversions.
For example, virt_to_phys() is implemented in terms of virt_to_user() and
user_to_phys().
2008-10-13 04:10:34 +01:00
Michael Brown
6df82b1a9d [undi] Scan for UNDI ROMs on 512-byte boundaries rather than 2kB boundaries
Apparently some BIOSes will place option ROMs on 512-byte boundaries.
While this is against specification, it doesn't actually hurt
anything, so we may as well increase our scan granularity to 512
bytes.

Contributed by Luca <lucarx76@gmail.com>
2008-09-12 03:10:27 +01:00
Michael Brown
4fbbf651d7 [i386] Change semantics of __from_data16 and __from_text16
__from_data16 and __from_text16 now take a pointer to a
.data16/.text16 variable, and return the real-mode offset within the
appropriate segment.  This matches the use case for every occurrence
of these macros, and prevents potential future bugs such as that fixed
in commit d51d80f.  (The bug arose essentially because "&pointer" is
still syntactically valid.)
2008-06-30 18:52:13 -07:00
Michael Brown
798ddf884f [undi] Ask for promiscuous packet reception when using UNDI driver
We never set up specific multicast filters; native drivers will ask
the card to receive all multicast packets.  The only way to achieve
this via the UNDI API is to enable promiscuous mode.
2008-06-10 08:56:44 +01:00
Michael Brown
1ba959c6b3 [NETDEV] Add notion of link state
Add ability for network devices to flag link up/down state to the
networking core.

Autobooting code will now wait for link-up before attempting DHCP.

IPoIB reflects the Infiniband link state as the network device link state
(which is not strictly correct; we also need a succesful IPoIB IPv4
broadcast group join), but is probably more informative.
2008-04-22 17:40:50 +01:00
Michael Brown
385b7a623d Guard against corruption of top half of %esp during UNDI ISR 2008-02-13 14:58:20 +00:00
H. Peter Anvin
9aec835541 undiisr.S: save/restore upper half of %eflags
Since we don't know what the UNDI code does, it is safest to
save/restore %eflags even though the lower half of %eflags is
automatically saved by the interrupt itself.
2008-02-10 18:13:39 -08:00
H. Peter Anvin
621c2886aa UNDI ISR: save and restore 32-bit registers
As written, if the if the UNDI ISR call clobbers the upper halves of
any of the GPRs (which by convention it is permitted to do, and by
paranoia should be expected to do) then nothing in the interrupt
handler will recover the state.

Additionally, save/restore %fs and %gs out of sheer paranoia - it's a
cheap enough operation, and may prevent problems due to poorly written
UNDI stacks.
2008-02-10 18:06:10 -08:00
Michael Brown
1949641d10 Fix compiler warnings that appear only on OpenBSD. 2007-12-06 14:16:46 -06:00
Michael Brown
304d1e9fa5 Don't rely on retry.c's periodically calling currticks() in order to
allow the UNDI NIC interrupt to happen.
2007-07-29 15:27:47 +01:00
Michael Brown
6d2e4e719c Move uninitialised .data16 variables to .bss16; saves around 2000
bytes of useless zeroes in the final image.
2007-07-16 13:22:12 +01:00
Michael Brown
8624fdc445 Kill off the enforced RX quota; it only seems to hurt on real hardware. 2007-07-14 00:30:11 +01:00
Michael Brown
2ac7694c3e Improve error reporting for strange length combinations reported by
the UNDI stack.

Ignore obviously invalid length combinations (as returned by
e.g. VMWare's PXE stack).

Limit to one packet per poll to avoid memory exhaustion.
2007-07-10 20:59:21 +01:00
Michael Brown
efd322091d Set up %ds *before* testing a value in our data segment (d'oh!).
Always send EOI; do not chain to BIOS's default interrupt handler.
They are just too unpredictable; at least VMware's seems to kill the
machine if you go anywhere near it.

Disable interrupts after return from PXENV_UNDI_ISR, just in case some
dumb PXE stack enables them.
2007-07-10 17:08:32 +01:00
Michael Brown
f6f9a3098d Report RX errors via netdev_rx_err() 2007-07-10 17:01:18 +01:00
Michael Brown
edc4648c39 Protect ISR against failure to unhook. 2007-07-10 04:34:53 +01:00
Michael Brown
027fed72c1 Working code to call the PXE stack from within the ISR. 2007-07-10 04:21:24 +01:00
Michael Brown
4c418d2100 Use net_device_operations structure and netdev_nullify() to allow for
safe dropping of the netdev ref by the driver while other refs still
exist.

Add netdev_irq() method.  Net device open()/close() methods should no
longer enable or disable IRQs.

Remove rx_quota; it wasn't used anywhere and added too much complexity
to implementing correct interrupt-masking behaviour in pxe_undi.c.
2007-07-07 16:43:39 +01:00
Holger Lubitz
c7549bcebe convert to zalloc 2007-07-06 20:19:06 +02:00
Holger Lubitz
bb61774ee4 convert to zalloc 2007-07-06 20:19:06 +02:00
Michael Brown
2dc8ed1eb8 Work around Etherboot 5.4 bug when multiple packets are received. 2007-07-03 15:53:29 +01:00
Michael Brown
0958726ebb It's not just Etherboot that fails to generate TX completions. 2007-07-03 14:43:57 +01:00
Michael Brown
adb3dd03e5 Document TX completion bug. 2007-07-03 13:17:58 +01:00
Michael Brown
e42eba4af4 Use a common base-memory packet buffer for DHCP construction (as used
by PXE and NBI) and UNDI packets (as used by undinet and UNDI).
2007-07-02 18:33:41 +01:00
Michael Brown
f77815f2b1 Kill off hotplug.h and just make net devices normal reference-counted
structures.

DHCP still broken and #if 0'd out.
2007-06-27 14:48:31 +01:00
Michael Brown
3e2c6b6736 pkbuff->iobuf changeover
Achieved via Perl using:

perl -pi -e 's/pk_buff/io_buffer/g; s/Packet buffer/I\/O buffer/ig; ' \
	-e 's/pkbuff\.h/iobuf.h/g; s/pkb_/iob_/g; s/_pkb/_iob/g; ' \
	-e 's/pkb/iobuf/g; s/PKB/IOB/g;'
2007-05-19 18:39:40 +00:00
Michael Brown
520d9c36af Updated ISAPnP, EISA, MCA and ISA buses to current device model.
ISA 3c509 is currently non-functional, although the EISA (3c509-eisa) and
MCA (3c529) variants should build OK.

None of this code is yet tested.
2007-03-10 18:08:33 +00:00
Michael Brown
7d9267561b Don't call PXENV_STOP_UNDI in the kpxeprefix. This slighy breaks the
clean separation between loading and starting, but does mean that more
PXE stacks survive the process.
2007-01-29 15:21:10 +00:00
Michael Brown
73b09ecba6 Use stdio.h instead of vsprintf.h 2007-01-19 01:13:12 +00:00
Michael Brown
f547f148d3 Use {get,set}_fbms() so that allocated base memory is correctly hidden. 2007-01-14 00:01:16 +00:00
Michael Brown
d0f4e9a54b Add some trace messages for important events 2007-01-13 17:54:41 +00:00
Michael Brown
4b77061881 Pick up the return status code from the correct place now that we
don't overwrite the parameter block until *after* the debug code.
2007-01-13 16:55:57 +00:00
Michael Brown
5817c9f114 When an UNDI API call fails, print everything there is to know about it. 2007-01-13 16:53:55 +00:00
Michael Brown
6a3c76c8e0 Always send EOI. We can't feasibly share interrupts (since we have no
clue what the "previous" interrupt handler will do, which could range
from "just an iret" to "disable the interrupt"), and that means that
we have to take responsibility for ACKing all interrupts.  Joy.
2007-01-13 14:45:26 +00:00
Michael Brown
f81bf3bc52 We *do* have a __data16_array after all! 2007-01-12 02:37:47 +00:00
Michael Brown
fdc97499bf Add device description fields to struct device. 2007-01-10 15:27:48 +00:00
Michael Brown
489a4004d7 Give UNDI device a more meaningful name. 2007-01-10 05:52:04 +00:00
Michael Brown
dad5274522 Add "name" field to struct device to allow human-readable hardware device
names.

Add "dev" pointer in struct net_device to tie network interfaces back to a
hardware device.

Force natural alignment of data types in __table() macros.  This seems to
prevent gcc from taking the unilateral decision to occasionally increase
their alignment (which screws up the table packing).
2007-01-10 04:22:09 +00:00
Michael Brown
c65fae2475 Add RX quotas to the net device poll() method. This avoids the problem
of alloc_pkb() exhaustion when e.g. an iSCSI-booted DOS session is left
idle for a long time at the C:\ prompt and builds up a huge packet
backlog.
2007-01-09 21:47:01 +00:00
Michael Brown
18e5353bed Rename pkb_available() to pkb_tailroom() for consistency with Linux's
skb_tailroom().  Add pkb_headroom().
2007-01-09 20:56:31 +00:00
Michael Brown
b7fcfe8ece Added net device TX queue; this will be needed to support the PXE UNDI API
(which will need us to wait for TX completions).

Added debug autocolourisation to netdevice.c
2007-01-09 20:18:31 +00:00
Michael Brown
3c2cc59d25 Added ability to break ISR processing over several calls to poll().
This will allow us to implement RX quotas.
2007-01-09 17:04:10 +00:00
Michael Brown
aa7bda7b47 Send EOI after enabling interrupt, in case the device had asserted IRQ
to the PIC while it was disabled.
2007-01-09 14:53:19 +00:00
Michael Brown
d606edb41d Added UNDI root bus driver (which saves including all the PCI bus code,
UNDI ROM code etc. when you just want a "undi.kpxe"-type image).

This driver cannot be used in conjunction with any other driver (it will
crash), or in any other format than .kpxe (it just won't find any network
devices).
2007-01-09 03:20:22 +00:00
Michael Brown
159930862f Added missing call to undinet_remove() 2007-01-09 03:08:01 +00:00
Michael Brown
6b09dd8244 undipci_probe() has to calculate busdevfn anyway, so we may as well pass
it directly to undi_load_pci().
2007-01-09 02:58:07 +00:00
Michael Brown
ed44e3730d Avoid erasing non-existent signatures in undi_unload() 2007-01-09 02:53:24 +00:00
Michael Brown
f2f492a536 If preloaded device matches, use that rather than going via the UNDI
loader.
2007-01-09 02:32:06 +00:00