[pxe] Fix interoperability with the 3Com DOS UNDI driver
[people/lynusvaz/gpxe.git] / src / arch / i386 / interface / pxe / pxe_undi.c
index fe124d6..90e837c 100644 (file)
@@ -211,6 +211,12 @@ PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
 
        DBG ( "PXENV_UNDI_TRANSMIT" );
 
+       /* Forcibly enable interrupts at this point, to work around
+        * callers that never call PXENV_UNDI_OPEN before attempting
+        * to use the UNDI API.
+        */
+       netdev_irq ( pxe_netdev, 1 );
+
        /* Identify network-layer protocol */
        switch ( undi_transmit->Protocol ) {
        case P_IP:      net_protocol = &ipv4_protocol;  break;
@@ -270,7 +276,7 @@ PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
                }
 
                /* Add link-layer header */
-               if ( ( rc = ll_protocol->push ( iobuf, ll_dest,
+               if ( ( rc = ll_protocol->push ( pxe_netdev, iobuf, ll_dest,
                                                pxe_netdev->ll_addr,
                                                net_protocol->net_proto ))!=0){
                        free_iob ( iobuf );
@@ -341,10 +347,17 @@ pxenv_undi_set_station_address ( struct s_PXENV_UNDI_SET_STATION_ADDRESS
 PXENV_EXIT_t
 pxenv_undi_set_packet_filter ( struct s_PXENV_UNDI_SET_PACKET_FILTER
                               *undi_set_packet_filter ) {
+
        DBG ( "PXENV_UNDI_SET_PACKET_FILTER" );
 
-       undi_set_packet_filter->Status = PXENV_STATUS_UNSUPPORTED;
-       return PXENV_EXIT_FAILURE;
+       /* Pretend that we succeeded, otherwise the 3Com DOS UNDI
+        * driver refuses to load.  (We ignore the filter value in the
+        * PXENV_UNDI_OPEN call anyway.)
+        */
+       DBG ( " %02x", undi_set_packet_filter->filter );
+       undi_set_packet_filter->Status = PXENV_STATUS_SUCCESS;
+
+       return PXENV_EXIT_SUCCESS;
 }
 
 /* PXENV_UNDI_GET_INFORMATION
@@ -630,8 +643,8 @@ PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) {
 
                /* Strip link-layer header */
                ll_protocol = pxe_netdev->ll_protocol;
-               if ( ( rc = ll_protocol->pull ( iobuf, &ll_dest, &ll_source,
-                                               &net_proto ) ) != 0 ) {
+               if ( ( rc = ll_protocol->pull ( pxe_netdev, iobuf, &ll_dest,
+                                               &ll_source, &net_proto )) !=0){
                        /* Assume unknown net_proto and no ll_source */
                        net_proto = 0;
                        ll_source = NULL;