One easy way to tell the manufacturer is look at the first part of the MAC address, it's specific to manufacturer (you can see this if you do an ethereal sniff that shows the ethernet packets, for instance -- note MAC addresses can be reset, so this may not be reliable). Otherwise, it's kind of tough. You might want to look at the sources for ifconfig and mii-tool and see how they gather info (a strace suggests that many disgusting ioctls are involved). You may well have to be executing within the kernel to get full info.
Question for you: Why on
earth do you actually want to do this? If you're not writing a network card driver, the low level nitty gritties of the ethernet card affect your programming nil. I suppose if you're writing an app that sends lots of data over a LAN, you might care about the speed the NIC has negotiated, but why let the flow control properties of TCP take care of this for you, in that case?
Of course, if you're just doing it to see if it can be done, more power to you!