123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
-
-
-
-
- #include "pxe.h"
-
-
- pxe_stack_t *pxe_stack = NULL;
-
-
-
-
-
- int pxe_initialise_nic ( void ) {
- if ( pxe_stack->state >= READY ) return 1;
-
- #warning "device probing mechanism has completely changed"
- #if 0
-
-
-
- if ( dev.disable ) {
-
-
- pxe_stack->state = READY;
- return 1;
- }
-
-
-
-
- if ( dev.state.pci.dev.use_specified == 1 ) {
- dev.how_probe = PROBE_NEXT;
- DBG ( " initialising NIC specified via START_UNDI" );
- } else if ( dev.state.pci.dev.driver ) {
- DBG ( " reinitialising NIC" );
- dev.how_probe = PROBE_AWAKE;
- } else {
- DBG ( " probing for any NIC" );
- dev.how_probe = PROBE_FIRST;
- }
-
-
- if ( eth_probe ( &dev ) != PROBE_WORKED ) {
- DBG ( " failed" );
- return 0;
- }
- #endif
-
-
- pxe_stack->state = READY;
- return 1;
- }
-
- int pxe_shutdown_nic ( void ) {
- if ( pxe_stack->state <= MIDWAY ) return 1;
-
- eth_irq ( DISABLE );
- disable ( &dev );
- pxe_stack->state = MIDWAY;
- return 1;
- }
-
- int ensure_pxe_state ( pxe_stack_state_t wanted ) {
- int success = 1;
-
- if ( ! pxe_stack ) return 0;
- if ( wanted >= MIDWAY )
- success = success & hook_pxe_stack();
- if ( wanted > MIDWAY ) {
- success = success & pxe_initialise_nic();
- } else {
- success = success & pxe_shutdown_nic();
- }
- if ( wanted < MIDWAY )
- success = success & unhook_pxe_stack();
- return success;
- }
-
-
- PXENV_EXIT_t pxe_api_call ( int opcode, union u_PXENV_ANY *any ) {
- PXENV_EXIT_t ret = PXENV_EXIT_FAILURE;
-
-
- any->Status = PXENV_STATUS_FAILURE;
-
- DBG ( "[" );
-
-
- switch ( opcode ) {
- case PXENV_START_UNDI:
- ret = pxenv_start_undi ( &any->start_undi );
- break;
- case PXENV_UNDI_STARTUP:
- ret = pxenv_undi_startup ( &any->undi_startup );
- break;
- case PXENV_UNDI_CLEANUP:
- ret = pxenv_undi_cleanup ( &any->undi_cleanup );
- break;
- case PXENV_UNDI_INITIALIZE:
- ret = pxenv_undi_initialize ( &any->undi_initialize );
- break;
- case PXENV_UNDI_RESET_ADAPTER:
- ret = pxenv_undi_reset_adapter ( &any->undi_reset_adapter );
- break;
- case PXENV_UNDI_SHUTDOWN:
- ret = pxenv_undi_shutdown ( &any->undi_shutdown );
- break;
- case PXENV_UNDI_OPEN:
- ret = pxenv_undi_open ( &any->undi_open );
- break;
- case PXENV_UNDI_CLOSE:
- ret = pxenv_undi_close ( &any->undi_close );
- break;
- case PXENV_UNDI_TRANSMIT:
- ret = pxenv_undi_transmit ( &any->undi_transmit );
- break;
- case PXENV_UNDI_SET_MCAST_ADDRESS:
- ret = pxenv_undi_set_mcast_address (
- &any->undi_set_mcast_address );
- break;
- case PXENV_UNDI_SET_STATION_ADDRESS:
- ret = pxenv_undi_set_station_address (
- &any->undi_set_station_address );
- break;
- case PXENV_UNDI_SET_PACKET_FILTER:
- ret = pxenv_undi_set_packet_filter (
- &any->undi_set_packet_filter );
- break;
- case PXENV_UNDI_GET_INFORMATION:
- ret = pxenv_undi_get_information (
- &any->undi_get_information );
- break;
- case PXENV_UNDI_GET_STATISTICS:
- ret = pxenv_undi_get_statistics ( &any->undi_get_statistics );
- break;
- case PXENV_UNDI_CLEAR_STATISTICS:
- ret = pxenv_undi_clear_statistics (
- &any->undi_clear_statistics );
- break;
- case PXENV_UNDI_INITIATE_DIAGS:
- ret = pxenv_undi_initiate_diags ( &any->undi_initiate_diags );
-
- break;
- case PXENV_UNDI_FORCE_INTERRUPT:
- ret = pxenv_undi_force_interrupt (
- &any->undi_force_interrupt );
- break;
- case PXENV_UNDI_GET_MCAST_ADDRESS:
- ret = pxenv_undi_get_mcast_address (
- &any->undi_get_mcast_address );
- break;
- case PXENV_UNDI_GET_NIC_TYPE:
- ret = pxenv_undi_get_nic_type ( &any->undi_get_nic_type );
- break;
- case PXENV_UNDI_GET_IFACE_INFO:
- ret = pxenv_undi_get_iface_info ( &any->undi_get_iface_info );
- break;
- case PXENV_UNDI_ISR:
- ret = pxenv_undi_isr ( &any->undi_isr );
- break;
- case PXENV_STOP_UNDI:
- ret = pxenv_stop_undi ( &any->stop_undi );
- break;
- case PXENV_TFTP_OPEN:
- ret = pxenv_tftp_open ( &any->tftp_open );
- break;
- case PXENV_TFTP_CLOSE:
- ret = pxenv_tftp_close ( &any->tftp_close );
- break;
- case PXENV_TFTP_READ:
- ret = pxenv_tftp_read ( &any->tftp_read );
- break;
- case PXENV_TFTP_READ_FILE:
- ret = pxenv_tftp_read_file ( &any->tftp_read_file );
- break;
- case PXENV_TFTP_GET_FSIZE:
- ret = pxenv_tftp_get_fsize ( &any->tftp_get_fsize );
- break;
- case PXENV_UDP_OPEN:
- ret = pxenv_udp_open ( &any->udp_open );
- break;
- case PXENV_UDP_CLOSE:
- ret = pxenv_udp_close ( &any->udp_close );
- break;
- case PXENV_UDP_READ:
- ret = pxenv_udp_read ( &any->udp_read );
- break;
- case PXENV_UDP_WRITE:
- ret = pxenv_udp_write ( &any->udp_write );
- break;
- case PXENV_UNLOAD_STACK:
- ret = pxenv_unload_stack ( &any->unload_stack );
- break;
- case PXENV_GET_CACHED_INFO:
- ret = pxenv_get_cached_info ( &any->get_cached_info );
- break;
- case PXENV_RESTART_TFTP:
- ret = pxenv_restart_tftp ( &any->restart_tftp );
- break;
- case PXENV_START_BASE:
- ret = pxenv_start_base ( &any->start_base );
- break;
- case PXENV_STOP_BASE:
- ret = pxenv_stop_base ( &any->stop_base );
- break;
-
- default:
- DBG ( "PXENV_UNKNOWN_%hx", opcode );
- any->Status = PXENV_STATUS_UNSUPPORTED;
- ret = PXENV_EXIT_FAILURE;
- break;
- }
-
- if ( any->Status != PXENV_STATUS_SUCCESS ) {
- DBG ( " %hx", any->Status );
- }
- if ( ret != PXENV_EXIT_SUCCESS ) {
- DBG ( ret == PXENV_EXIT_FAILURE ? " err" : " ??" );
- }
- DBG ( "]" );
-
- return ret;
- }
|