From 356c9285e3303371af78bf7fdabebccf713d238f Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Tue, 3 Apr 2012 14:35:55 +0200 Subject: bsp/mpc55xx: Implement network interface off --- .../libbsp/powerpc/mpc55xxevb/network/smsc9218i.c | 32 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c index 3ec27b59fb..c32486c6d5 100644 --- a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c +++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c @@ -1788,6 +1788,33 @@ static void smsc9218i_interface_stats(smsc9218i_driver_entry *e) printf("frame compact count: %u\n", jc->frame_compact_count); } +static void smsc9218i_interface_off(struct ifnet *ifp) +{ + smsc9218i_driver_entry *e = (smsc9218i_driver_entry *) ifp->if_softc; + rtems_status_code sc = RTEMS_SUCCESSFUL; + rtems_interrupt_level level; + union SIU_DIRER_tag direr = MPC55XX_ZERO_FLAGS; + + /* remove interrupt handler */ + sc = rtems_interrupt_handler_remove( + MPC55XX_IRQ_SIU_EXTERNAL_0, + smsc9218i_interrupt_handler, + e + ); + ASSERT_SC(sc); + + mpc55xx_edma_release_channel( + &e->edma_receive + ); + + mpc55xx_edma_release_channel( + &e->edma_transmit + ); + + /* set in reset state */ + smsc9218i_reset_signal(false); +} + static int smsc9218i_interface_ioctl( struct ifnet *ifp, ioctl_command_t command, @@ -1808,12 +1835,11 @@ static int smsc9218i_interface_ioctl( ether_ioctl(ifp, command, data); break; case SIOCSIFFLAGS: - if (ifp->if_flags & IFF_RUNNING) { - /* TODO: off */ - } if (ifp->if_flags & IFF_UP) { ifp->if_flags |= IFF_RUNNING; /* TODO: init */ + } else { + smsc9218i_interface_off(ifp); } break; case SIO_RTEMS_SHOW_STATS: -- cgit v1.2.3