diff options
author | Christian Mauderer <Christian.Mauderer@embedded-brains.de> | 2012-04-03 14:35:55 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-07-18 09:46:13 +0200 |
commit | 356c9285e3303371af78bf7fdabebccf713d238f (patch) | |
tree | 22347b33d12b4df5d082471f48ce42ab7eef74a0 /c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c | |
parent | bsp/mpc55xx: Support re-initialization of eDMA (diff) | |
download | rtems-356c9285e3303371af78bf7fdabebccf713d238f.tar.bz2 |
bsp/mpc55xx: Implement network interface off
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c | 32 |
1 files changed, 29 insertions, 3 deletions
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: |